Shior 框架进阶(五)----------授权

                                                                          Shior 框架进阶(五)

                                                                                                         ----------授权

 

 

 

授权流程原理 

 

授权

 

授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体 (Subject)、资源(Resource)、权限(Permission)、角色(Role)。

 

主体(Subject)  主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。

 

资源(Resource) 在应用中用户可以访问的任何东西,比如JSP 页面、某些数据、某个业务方法等等都是资源。用户只要授权后才能访问。

 

权限(Permission) 权限表示在应用中用户能不能访问某个资源, 如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)打印文档等等。

 

角色(Role) 角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限 时比较方便。 典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。

 

判断是否授权的方式 

Shiro 支持三种方式的授权判断: 

编程式

通过写if/else 授权代码块完成: 

Subject subject = SecurityUtils.getSubject();  if(subject.hasRole(“admin”)) 

{        

//有权限 

 } else {   

//无权限 

 

 

注解式

通过在执行的Java方法上放置相应的注解完成: 

@RequiresRoles("admin") 

public void hello() {    

 //有权限 

 }

 

 

JSP 标签 在JSP 页面通过相应的标签完成: 

<shiro:hasRole name="admin"> 

  <!— 有权限—> 

</shiro:hasRole> 

 

 

 

  1. 配置ini文件 shiro­authorization.ini 

 

#用户

[users]

#用户Sulliven的密码是123456,此用户具有role1和role3两个角色

helen=123456,role1,role3

lisi=123456,role2

#角色和权限

[roles]

role1=system:user:*,system:menu:*

role2=system:user:list

role3=system:config:* 

 

 

  1. 判断角色和权限

注意:首先要认证

public class AuthorizationTest {

 

 

  // 角色授权、资源授权测试    

@Test    

public void testAuthorization() {

        //=================认证开始:以下和前面认证的测试一致

        // 创建SecurityManager工厂        

IniSecurityManagerFactory factory =

new IniSecurityManagerFactory("classpath:shiro-authorization.ini");

 

// 创建SecurityManager        

SecurityManager securityManager = factory.getInstance();       

 

 // 将securityManager设置当前的运行环境中        

SecurityUtils.setSecurityManager(securityManager);        

 

 

// 从SecurityUtils里边创建一个subject        

Subject subject = SecurityUtils.getSubject();       

 

 // 在认证提交前准备token(令牌)       

 // 这里的账号和密码 将来是由用户输入进去        

UsernamePasswordToken token = new UsernamePasswordToken("Sulliven", "123456");        

 

// 执行认证提交     

subject.login(token);

 

 

// 是否认证通过        

boolean isAuthenticated = subject.isAuthenticated();       

 System.out.println("是否认证通过:" + isAuthenticated);

 

 

 

 

// 退出操作(不要退出登录)        

//subject.logout();

       

// 是否认证通过        

//isAuthenticated = subject.isAuthenticated();        

//System.out.println("是否认证通过:" + isAuthenticated);

       

//=================认证结束         //=================授权开始

       

// 认证通过后执行授权        

//(1)基于角色的授权       

//(1.1) hasRole传入角色标识:单个角色判断        

 

boolean ishasRole = subject.hasRole("role1");        

System.out.println("单个角色判断" + ishasRole);

 

 

  //(1.2)hasRole传入角色标识:多个角色判断        

boolean[] hasRoles = subject.hasRoles(Arrays.asList("role1", "role2"));        

 

System.out.println("当前用户是否拥有以下角色:");        

 

for (boolean b : hasRoles) {           

      System.out.println(b);       

 }  

 

 

//(1.3)hasAllRoles是否同时拥有以下多个角色:多个角色判断        

 

boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1", "role3"));        

 

System.out.println("多个角色判断" + hasAllRoles); 

 

//(1.4)除了has这之后角色的判断还有check方法不会主动抛出异常,但是需要捕获  

 

 

 

 

//(2)基于资源的授权        

//(2.1)isPermitted传入权限标识符:单个权限判断      

 

 boolean isPermitted = subject.isPermitted("system:user:create");        

 

System.out.println("是否有权限:" + isPermitted);

 

  //(2.2)多个权限判断        

boolean isPermittedAll = subject.isPermittedAll("system:user:list", "system:config:list");        

 

System.out.println("多个权限判断:" + isPermittedAll);        

 

//(2.3)使用check方法进行授权检测,如果授权不通过会抛出异常        

try {            

subject.checkPermission("system:config:list");        

} catch (AuthorizationException e) {          

 System.out.println("权限未定义");            

e.printStackTrace();       

 }    

}

}

 

 

 

以上就是对授权的一个简单的展示,以及各种检测授权的方法

注意的是:一般我们一不同的角色来给与不同的权限,也就是通过给用户分配角色来达到分配权限的目的;

 

但是在实际运用当中我们是通过shiro来授权包括检验,所以以后是不会在ini文件中授予角色的,所以下一篇会为大家带来之前提及的自定义realm来完成授权。

敬请期待!!!!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42112846;

猜你喜欢

转载自blog.csdn.net/qq_42112846/article/details/81544715
今日推荐