04-授权(ssm+Shiro)
授权:操作系统资源的权限(who对what进行how操作)
Shiro 支持三种方式的授权:
1、编程式:通过写if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
2、注解式:通过在执行的Java方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello() {
//有权限
}
3、JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>
本教程序授权测试使用第一种编程方式,实际与web系统集成使用后两种方式。【第一种的配置比较繁琐,也不实际】
权限字符串的规则:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
例子:
用户创建权限:user:create,或user:create:*
用户修改实例001的权限:user:update:001
用户实例001的所有权限:user:*:001
-------------------------------------------------------------------------
一、创建shiro-permission.ini【这个文件相当于数据库】
# 【用户】 [users] # 用户zhang的密码是123,此用户具有role1和role2两个角色 zhang=123,role1,role2 wang=123,role2 # 【角色】 [roles] # 角色role1对资源user拥有create、update权限 role1=user:create,user:update # 角色role2对资源user拥有create、delete权限 role2=user:create,user:delete # 角色role3对资源user拥有create权限 role3=user:create
二、测试代码
AuthorizationTest.java
package cn.itcast.shiro.authorization; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.junit.Test; // 授权测试 public class AuthorizationTest { // 角色、权限授权 @Test public void testAuthorization() { // 准备工作 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); // 先认证通过后才能进行授权操作 UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); try { subject.login(token); } catch (AuthenticationException e) { e.printStackTrace(); } System.out.println("认证结果:" + subject.isAuthenticated()); System.out.println("--------------------------------"); System.out.println("授权结果:"); // 授权 // 1.基于角色的授权,除了下面的方法,还有其他方法,比如hasAllRoles()等等,具体查看文档 boolean hasRole_role1 = subject.hasRole("role1"); System.out.println("是否拥有role1角色:" + hasRole_role1); boolean hasRole_role10 = subject.hasRole("role10"); System.out.println("是否拥有role10角色:" + hasRole_role10); // 2.基于资源的授权,除了下面的方法,还有其他方法,具体查看文档 boolean permitted_Usercreate = subject.isPermitted("user:create"); boolean permitted_UserAdd = subject.isPermitted("user:add"); System.out.println("是否拥有user:create权限:" + permitted_Usercreate); System.out.println("是否拥有user:add权限:" + permitted_UserAdd); // 具体资源,如果拥有user:create角色,就代表拥有user:create:*的角色 boolean permitted_001 = subject.isPermitted("user:create:001"); System.out.println("是否拥有user:create:001(新增001用户)的权限:" + permitted_001); } }
工程结构:
测试结果:
认证结果:true
--------------------------------
授权结果:
是否拥有role1角色:true
是否拥有role10角色:false
是否拥有user:create权限:true
是否拥有user:add权限:false
是否拥有user:create:001(新增001用户)的权限:true