博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安全框架shiro(二):shiro进阶
阅读量:4104 次
发布时间:2019-05-25

本文共 6118 字,大约阅读时间需要 20 分钟。

 

一.shiro授权

1.1.概念

1.2.角色访问控制

控制那些角色可以进行访问,.ini文件配置如下:

[users]hly = 123,role1,role2abc = 123,role1

用户hly拥有角色role1,role2,所验证的代码如下

@Test    public  void testHasRole(){        iniConfig("classpath:shiro/authorization/shiro-role.ini","hly","123");        Assert.assertTrue(subject().hasRole("role1"));        Assert.assertTrue(subject().hasAllRoles(Arrays.asList("role1", "role2")));        boolean [] result = subject().hasRoles(Arrays.asList("role1","role2","role3"));        Assert.assertEquals(true,result[0]);        Assert.assertEquals(true,result[1]);        Assert.assertEquals(false,result[2]);    }

根据hasRole,hasAllRoles等方法可以判断用户是否拥有相关的权限。

1.3.资源访问控制

控制用户可以进行的相关操作,如CRUD等.

.ini文件配置主体和角色所拥有的权限,如下,具体配置方法如思维导图所示.

[users]hly = 123,role1,role2abc = 123,role1[roles]role1 = user:create,user:updaterole2 = user:create,user:delete

接下来,我们可以用isPermitted,isPermittedAll等方法对主体所拥有的权限进行测试,如下:

@Test    public void testPermission(){        iniConfig("classpath:shiro/authorization/shiro-permission.ini","hly","123");        Assert.assertTrue(subject().isPermitted("user:create"));        Assert.assertTrue(subject().isPermittedAll("user:create","user:delete"));        Assert.assertFalse(subject().isPermitted("user:view"));    }

1.4.自定义授权规则

 

自定义授权.ini文件配置

[main]#自定义authorizerauthorizer=org.apache.shiro.authz.ModularRealmAuthorizer#自定义permissionResolver#permissionResolver=org.apache.shiro.authz.permission.WildcardPermissionResolverpermissionResolver=com.hly.shiro.authorization.BitAndWildPermissionResolver#解析权限字符串到 Permission 实例authorizer.permissionResolver=$permissionResolver#自定义rolePermissionResolverrolePermissionResolver=com.hly.shiro.authorization.MyRolePermissionResolver#根据角色解析相应的权限集合authorizer.rolePermissionResolver=$rolePermissionResolver#进行授权控制securityManager.authorizer=$authorizer#自定义realm 一定要放在securityManager.authorizer赋值之后(因为调用setRealms会将realms设置给authorizer,并给各个Realm设置permissionResolver和rolePermissionResolver)realm=com.hly.shiro.realm.MyRealmsecurityManager.realms=$realm

1.解析权限字符串到 Permission 实例,得到相应配置规则的字符串。

permissionResolver=com.hly.shiro.authorization.BitAndWildPermissionResolver#解析权限字符串到 Permission 实例authorizer.permissionResolver=$permissionResolver

如配置中的BitAndWildPermissionResolver,BitPermission为自定义匹配方法,WildcardPermission为默认通配符匹配。

public class BitAndWildPermissionResolver implements PermissionResolver {    @Override    //“+” 开头来解析权限字符串为 BitPermission 或 WildcardPermission。    public Permission resolvePermission(String permissionString) {        if(permissionString.startsWith("+")){            return new BitPermission(permissionString);        }        return new WildcardPermission(permissionString);    }}

2.根据角色解析相应的权限集合,判断角色是否拥有相应的权限,在自定义realm中,如果添加了role1角色,则可匹配memu:*。

#自定义rolePermissionResolverrolePermissionResolver=com.hly.shiro.authorization.MyRolePermissionResolver#根据角色解析相应的权限集合authorizer.rolePermissionResolver=$rolePermissionResolver
public class MyRolePermissionResolver implements RolePermissionResolver {    @Override    public Collection
resolvePermissionsInRole(String roleString) { if("role1".equals(roleString)){ return Arrays.asList((Permission) new WildcardPermission("menu:*")); } return null; }}

3.自定义realm,AuthorizationInfo进行授权和添加角色,AuthenticationInfo进行身份验证.

package com.hly.shiro.realm;import com.hly.shiro.authorization.BitPermission;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.authz.permission.WildcardPermission;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;/** * @author :hly * @github :github.com/SiriusHly * @blog :blog.csdn.net/Sirius_hly * @date :2018/9/3 *//** * 自定义Realm */public class MyRealm extends AuthorizingRealm {    @Override    //表示根据用户身份获取授权信息    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();        //添加角色        authorizationInfo.addRole("role1");        authorizationInfo.addRole("role2");        //添加权限        authorizationInfo.addObjectPermission(new BitPermission("+user1+10+1+1"));        authorizationInfo.addObjectPermission(new BitPermission("+user1+4"));        authorizationInfo.addObjectPermission(new BitPermission("+user1+2"));        authorizationInfo.addObjectPermission(new BitPermission("+user1+8"));        authorizationInfo.addObjectPermission(new WildcardPermission("user1:*"));        authorizationInfo.addStringPermission("+user2+10");        authorizationInfo.addStringPermission("user2:*");        return authorizationInfo;    }    @Override    //表示获取身份验证信息    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {        String username = (String)authenticationToken.getPrincipal();//用户名        String password = new String((char[])authenticationToken.getCredentials());//密码        if(!"hly".equals(username)) {            throw new UnknownAccountException(); //如果用户名错误        }        if(!"123".equals(password)) {            throw new IncorrectCredentialsException(); //如果密码错误        }        //如果身份认证验证成功,返回一个AuthenticationInfo实现;        return new SimpleAuthenticationInfo(username, password, getName());            }}

4.进行权限测试

@Test    public void testAuthorizerTest(){        iniConfig("classpath:shiro/authorization/shiro-authorizer.ini","hly","123");        //判断拥有权限        Assert.assertTrue(subject().hasRole("role1"));        Assert.assertTrue(subject().hasRole("role2"));        Assert.assertTrue(subject().isPermitted("user1:delete"));        Assert.assertTrue(subject().isPermitted("user2:view"));        Assert.assertTrue(subject().isPermitted("+user1+2"));        Assert.assertTrue(subject().isPermitted("+user1+8"));        Assert.assertTrue(subject().isPermitted("+user2+10"));        Assert.assertTrue(subject().isPermitted("+user1+10+1+1"));        Assert.assertTrue(subject().isPermitted("+user1+4"));        Assert.assertTrue(subject().isPermitted("menu:view"));    }

以上完整代码可在笔者中找到,参考。

你可能感兴趣的文章
卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!
查看>>
厉害了!Python 编辑器界的神器 Jupyter ,推出官方可视化 Debug 工具!
查看>>
卧槽!Java 虚拟机竟然还有这些性能调优技巧...
查看>>
听说玩这些游戏能提升编程能力?
查看>>
7 年工作经验,面试官竟然还让我写算法题???
查看>>
被 Zoom 逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
查看>>
再见,Eclipse...
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
漫话:为什么你下载小电影的时候进度总是卡在 99% 就不动了?
查看>>
我去!原来大神都是这样玩转「多线程与高并发」的...
查看>>
当你无聊时,可以玩玩 GitHub 上这个开源项目...
查看>>
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>
安利 10 个让你爽到爆的 IDEA 必备插件!
查看>>
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
Java各种集合类的合并(数组、List、Set、Map)
查看>>
JS中各种数组遍历方式的性能对比
查看>>
Mysql复制表以及复制数据库
查看>>