【问题标题】:Apache Shiro: How would you manage Users?Apache Shiro:您将如何管理用户?
【发布时间】:2013-04-20 20:23:58
【问题描述】:

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

  1. 是否最好为每个注册会员创建 Shiro 用户?
  2. 或者创建一个 Shiro 用户,然后为每个成员将其存储到某个数据库并通过该 Shiro 用户访问它?

如果您选择#1,您将如何管理/自动化它?我参与的大多数项目都选择了#2。

谢谢

【问题讨论】:

    标签: shiro


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

    【讨论】:

      【解决方案2】:

      您可以只使用Stormpath 作为您的用户/组存储。加入Shiro integration 和繁荣 - 具有完整管理 UI 和 Java SDK 的支持 Shiro 的应用程序的即时用户/组数据存储。

      它甚至可以帮助自动化诸如“忘记密码”电子邮件和帐户电子邮件验证之类的事情。它对于许多用途也是免费的。您可以以Shiro sample app using Stormpath 为例。

      【讨论】:

        【解决方案3】:

        Shiro 提供了多种配置用户的方法。看看可能的领域配置here

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

        【讨论】:

          【解决方案4】:

          请不要为每个人只使用一个用户。避免使用此选项。 每个用户使用一个用户(帐户)要好得多。

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

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

          【讨论】:

            【解决方案5】:

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

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

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

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

            例如,我有一个 shiro hibernate 领域,我使用我的 hibernate 代码来管理我的数据库中的用户。

            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;
                }
            
            }
            

            【讨论】:

              猜你喜欢
              • 2013-10-29
              • 2012-06-02
              • 2018-11-09
              • 1970-01-01
              • 2014-10-13
              • 2014-07-09
              • 2013-06-28
              • 2018-03-17
              • 2013-07-20
              相关资源
              最近更新 更多