6

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

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

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

谢谢

4

5 回答 5

10
  1. 在 shiro.ini 中配置用户对于生产环境来说不是一个好的选择。仅当您拥有少量用户帐户并且不需要在运行时创建或更改帐户时才可以使用它。它主要用于测试。
  2. 几乎所有项目都最好使用一些存储来保留所有用户帐户。它可以是数据库或一些外部身份验证引擎,如 ldap、cas 甚至 oauth。
于 2013-04-27T08:49:37.927 回答
3

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

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

于 2013-05-01T22:31:43.980 回答
0

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

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

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

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

例如,我有一个 shiro 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;
    }

}
于 2014-06-26T07:23:13.233 回答
0

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

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

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

于 2014-06-11T03:02:44.003 回答
0

Shiro 提供了多种方式来配置用户。在此处查看可能的 Realm 配置。

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

于 2014-03-21T23:51:30.283 回答