shiro授权的配置,使用及其说明
1.授权
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
主体
主体,即访问应用的用户,在 Shiro 中使用 Subject 代表该用户。用户只有授权后才允许访问相应的资源。
资源
在应用中用户可以访问的任何东西,比如访问 JSP 页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。
权限
安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如: 访问用户列表页面
查看/新增/修改/删除用户数据(即很多时候都是 CRUD(增查改删)式权限控制)
2.授权配置方式
2.1使用shiro.ini直接授权
shiro.ini文件
[users]
#用户名 = 密码,角色1,角色2
admin=123,role1,role2
测试文件
@Test
public void test() {
login("classpath:shiro-role.ini", "admin", "123");
//判断拥有角色:role1
Assert.assertTrue(subject().hasRole("role1"));
//判断拥有角色:role1 and role2
Assert.assertTrue(subject().hasAllRoles(Arrays.asList("role1", "role2")));
//判断拥有角色:role1 and role2 and !role3
boolean[] result = subject().hasRoles(Arrays.asList("role1", "role2", "role3"));
Assert.assertEquals(true, result[0]);
Assert.assertEquals(true, result[1]);
Assert.assertEquals(false, result[2]);
};
2.2配置shiro.ini文件并对于role授权
shiro.ini文件
[users]
admin=123,role1,role2
[roles]
role1=user:create,user:update
role2=user:delete;
测试方法
@Test
public void testIsPermitted() {
login("classpath:shiro-permission.ini", "zhang", "123");
//判断拥有权限:user:create
Assert.assertTrue(subject().isPermitted("user:create"));
//判断拥有权限:user:update and user:delete
Assert.assertTrue(subject().isPermittedAll("user:update", "user:delete"));
//判断没有权限:user:view
Assert.assertFalse(subject().isPermitted("user:view"));
};
2.3使用自定义的realm
MyRealm文件
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addRole("role1");
authorizationInfo.addRole("role2");
authorizationInfo.addObjectPermission(new BitPermission("+user1+10"));
authorizationInfo.addObjectPermission(new WildcardPermission("user1:*"));
authorizationInfo.addStringPermission("+user2+10");
authorizationInfo.addStringPermission("user2:*");
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//对用户进行认证。
//如果身份认证验证成功,返回一个AuthenticationInfo实现;
return new SimpleAuthenticationInfo(username, password, getName());
};
shiro.ini文件配置
myRealm=com.github.shiro.realm.MyRealm
securityManager.realms=$myRealm
3.判断用户使用有权限的三种方式
Shiro 支持三种方式的授权
#编程式:通过写 if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
};
#注解式:通过在执行的 Java 方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello() {
//有权限
};
#没有权限将抛出相应的异常;
#JSP/GSP 标签:在 JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!— 有权限 —>
</shiro:hasRole>
注意点
1.checkRole/checkRoles 判断为假的情况下会抛出 UnauthorizedException 异常。
hasRole/hasAllRoles 不会抛出异常。
2.checkPermission/checkPermissions 判断为假的情况下会抛出 UnauthorizedException 异常。
isPermitted/isPermittedAll 不会抛出异常。
3.shiro没有提供判断是否有某个role和permission的方法。