我正在使用Apache Shiro(v1.2.3)并且我正确地设置了用户名/密码身份验证并且它正在工作(我将密码哈希值和盐存储在远程数据库中)。我现在正尝试使用角色设置权限。我有一个扩展AuthorizingRealm
的领域,例如
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
// no problems here...
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principles) {
Set<String> roles = // get the roles for this user from the DB
LOG.info("Found roles => " + roles.toString());
return new SimpleAuthorizationInfo(roles);
}
}
我的shiro.ini
看起来像这样:
[主要]
myRealm = ie.enki.closing.users.MyRealmcredentialsMatcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
credentialsMatcher.storedCredentialsHexEncoded = false
credentialsMatcher.hashIterations = 1024myRealm.credentialsMatcher = $ credentialsMatcher
cacheManager = org.ehcache.integrations.shiro.EhcacheShiroManager
securityManager.cacheManager = $ cacheManager[角色]
admin = *
staff = resource_1:action_1
相关的启动日志记录报告ehcache正在正确设置但在此之前,它还提到了这一点:
[main] INFO org.apache.shiro.realm.text.IniRealm - IniRealm定义, 但没有定义[users]部分。这个领域不会 填充了任何用户,并假设它们将被填充 编程。必须为此Realm实例定义用户 有用。
[主要] INFO org.apache.shiro.realm.AuthorizingRealm - 没有缓存 或已设置cacheManager属性。授权缓存不能 获得。
...
一些ehcache设置日志...
在我的测试中,currentUser.isPermitted("resource_1:action_1")
会返回false
,即使我的日志记录显示我确实拥有admin
角色(我也尝试过staff
角色)
shiro文档谈论在shiro.ini
中设置[users]部分并为用户分配角色,如:
[用户]
some_user =密码,role1,role2
...但我不想在ini文件中定义用户及其密码。这就是我的数据库。我是否误解了配置中的某些内容?
再次浏览文档后,似乎[roles]部分仅适用于您使用[users]部分定义少量静态用户的情况。如果是这样,那么如何将角色与数据库中定义的用户的权限相关联。 docs that might reveal this info不完整。
答案 0 :(得分:2)
如果您未使用IniRealm
,则不要直接映射角色 - &gt;权限。您必须告诉Shiro用户对SimpleAuthorizationInfo
addStringPermissions或addObjectPermissions的权限,如果您使用角色分配权限组,请手动检索这些权限。
根据您的应用,有多种方法可以执行此操作。如果不知道您的应用程序有多复杂,那么推荐一种方法就很困难。为了获得最大的灵活性,您可以创建3个数据库表:USER_PERMISSIONS
,ROLE_PERMISSIONS
和USER_ROLES
。
如果您只进行权限检查,我建议doGetAuthorizationInfo
仅检索分配给用户的权限。角色仅用于前端,以帮助为某些用户分配权限组。这是Shiro在Roles中推荐的明确角色。
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principles) {
Set<String> permissions = // get the permissions for this user from the DB
SimpleAuthorizationInfo simpleAuth = new SimpleAuthorizationInfo();
simpleAuth.addStringPermissions(permissions);
return simpleAuth;
}
P.S。我会删除[roles]
部分并明确定义您的领域到Shiro。不建议Implicit Assignment。为此,请在删除[roles]
后将以下行添加到配置中。
securityManager.realms = $myRealm