Apache Shiro:您将如何管理用户?

时间:2013-04-26 15:35:32

标签: shiro

我想在我的下一个网络项目中使用Shiro,但我不知道管理用户的好(如果不是最好的)策略(shiro.ini中的[users])。

  1. 最好是为每个注册会员创建Shiro用户吗?
  2. 或者创建一个Shiro用户然后为每个成员将其存储到某个数据库并通过该Shiro用户访问它?
  3. 如果您选择#1,您将如何管理/自动化?我工作的大多数项目选择了#2。

    由于

5 个答案:

答案 0 :(得分:10)

  1. 在shiro.ini中配置用户不是生产环境的好选择。仅当您拥有少量用户帐户且无需在运行时创建或更改帐户时,才能使用它。它主要用于测试。
  2. 几乎所有项目最好使用一些存储来保留所有用户帐户。它可以是数据库或一些外部认证引擎,如ldap,cas甚至是oauth。

答案 1 :(得分:3)

您可以使用Stormpath作为您的用户/群组商店。使用完整的管理UI和Java SDK,为支持Shiro的应用程序提供Shiro integration和繁荣 - 即时用户/组数据存储。

它甚至可以帮助自动执行“忘记密码”电子邮件和帐户电子邮件验证等操作。对于许多用途它也是免费的。您可以看到Shiro sample app using Stormpath作为示例。

答案 2 :(得分:0)

Shiro提供了多种配置用户的方法。看一下可能的Realm配置here

如果这些都不能满足您的需求,您甚至可以为您的应用程序编写自定义Realm,例如,可以从NoSQL数据库中提取用户信息,或从SAML响应中获取信息,或使用OAuth2。在生产中的shiro.ini中创建任何用户详细信息绝对不可取。为了给出自定义域可能是什么样子的概念,我在这里创建了一个基于SAML2的用户authc和authz:shiro-saml2

答案 3 :(得分:0)

每个人不会只使用一个用户。避免这个选择。 每个用户使用一个用户(帐户)要好得多。

在shiro中,您可以使用RDMS Realm,它允许您使用像mysql这样的简单数据库来存储您的用户/帐户/权限。 :)

克隆这个项目,(不是我的),并在1分钟内开始! :) shiro/mysql GIT example 享受它:))

答案 4 :(得分:0)

Shiro根据您的要求提供您自己的领域。

创建一个简单的领域,您可以在其中管理详细信息,登录,权限和角色。 您可以使用jdbc,Hibernate或任何其他身份验证方式来管理它们。

将此领域配置为您的ini或您在项目中使用的任何方式。

现在,Shiro将自动调用您的领域类的方法来查找凭据,权限和角色。

对于ex我有一个shiro hibernate领域我用我的hibernate代码来管理我的db中的用户。

import java.util.Collection;
import java.util.Date;
import java.util.HashSet;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * @author Ankit
 * 
 */
public class PortalHibernateRealm extends AuthorizingRealm {

    private static final Logger LOGGER = new Logger(
            PortalHibernateRealm.class.toString());

    /**
     * 
     */
    public PortalHibernateRealm() {
        super();
        /*
         * Set credential matcher on object creation
         */
        setCredentialsMatcher(new CredentialsMatcher() {

            @Override
            public boolean doCredentialsMatch(AuthenticationToken arg0,
                    AuthenticationInfo arg1) {
                UsernamePasswordToken token = (UsernamePasswordToken) arg0;
                String username = token.getUsername();
                String password = new String(token.getPassword());
                /*
                    Check for credential and return true if found valid else false
                */
                return false;
            }
        });
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principalCollection) {
        Collection<String> permissionSet;
        SimpleAuthorizationInfo info = null;
        Long userId = (Long) principalCollection.getPrimaryPrincipal();

        //Using thi principle create  SimpleAuthorizationInfo and provide permissions and roles 
            info = new SimpleAuthorizationInfo();

        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken authcToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

        /*using this token create a SimpleAuthenticationInfo like 
        User user = UserUtil.findByEmail(token.getUsername());
        */
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                primaryPrin, Password, screenName);

        return authenticationInfo;
    }

}