之前说了权限认证,其实也就是登录验证身份
这次来说说shiro的授权
shiro可以针对角色授权,或者访问资源授权
两者都行,但是在如今的复杂系统中,当然使用后者,如果你是小系统或者私活的话,前者即可,甚至可以不用,我懂的
好吧,上代码:
首先新建一个ini,登陆信息以及权限配置好
1 #用户 2 [users] 3 #eric 用户nathan的密码是123456,拥有boss以及hr两个权限 4 eric=123456,boss,hr 5 merry=123456,hr 6 7 #权限 8 [roles] 9 #角色对用资源user来说拥有create以及update权限 10 boss=user:create,user:update 11 #角色对用资源user来说拥有create以及delete权限 12 hr=user:create,user:delete 13 #角色对用资源user来说拥有create权限 14 tl=user:create
以下代码先登陆,后授权,分为角色以及资源
1 @Test 2 public void testAuthorization() { 3 4 // 创建SecurityManager工厂 5 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/shiro-permission.ini"); 6 // 创建SecurityManager 7 SecurityManager securityManager = factory.getInstance(); 8 // 将SecurityManager设置到系统运行环境,和spring后将SecurityManager配置spring容器中,一般单例管理 9 SecurityUtils.setSecurityManager(securityManager); 10 // 创建subject 11 Subject subject = SecurityUtils.getSubject(); 12 // 创建token令牌 13 UsernamePasswordToken token = new UsernamePasswordToken("eric", "123456"); 14 // 执行认证 15 try { 16 subject.login(token); 17 } catch (AuthenticationException e) { 18 e.printStackTrace(); 19 } 20 System.out.println("认证状态:" + subject.isAuthenticated()); 21 // 认证通过后执行授权 22 23 // 基于角色的授权 24 // hasRole传入角色标识 25 boolean ishasRole = subject.hasRole("hr"); 26 System.out.println("单个角色判断" + ishasRole); 27 // hasAllRoles是否拥有多个角色 28 boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("boss", "hr", "tl")); 29 System.out.println("多个角色判断" + hasAllRoles); 30 31 // 使用check方法进行授权,如果授权不通过会抛出异常 32 // subject.checkRole("employee"); 33 34 // 基于资源的授权 35 // isPermitted传入权限标识符 36 boolean isPermitted = subject.isPermitted("user:create:1"); 37 System.out.println("单个权限判断" + isPermitted); 38 39 boolean isPermittedAll = subject.isPermittedAll("user:create:1", 40 "user:delete"); 41 System.out.println("多个权限判断" + isPermittedAll); 42 43 // 使用check方法进行授权,如果授权不通过会抛出异常 44 subject.checkPermission("items:create:1"); 45 46 }
这些都是简单的配置
过后会讲讲如何配合springmvc spring 以及mybatis进行动态认证授权