Shiro授权

Posted lxc116317

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro授权相关的知识,希望对你有一定的参考价值。

授权流程

技术分享图片

三种授权方法

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>

shiro-permission.ini

shiro-permission.ini里边的内容相当于在数据库。

技术分享图片

权限标识符号规则:资源:操作:实例(中间使用半角:分隔)

usercreate:01  表示对用户资源的01实例进行create操作。

user:create:表示对用户资源进行create操作,相当于user:create:*,对所有用户资源实例进行create操作。

user*01  表示对用户资源实例01进行所有操作。

程序编写

技术分享图片
    @Test
    public void test1() {

    Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:config/shiro-permission.ini");
    
    SecurityManager securityManager=factory.getInstance();
    
    SecurityUtils.setSecurityManager(securityManager);
    
    Subject subject=SecurityUtils.getSubject();
    
    UsernamePasswordToken token=new UsernamePasswordToken("zhangsan", "123");
    
    try {
//        登录
        subject.login(token);
    } catch (AuthenticationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
//    认证状态
    System.out.println("认证状态:"+subject.isAuthenticated());
    
//    认证通过后授权
//    基于角色的授权
//    hasrole传入角色标识
    boolean ishasRole=subject.hasRole("role1");
    System.out.println("单个角色判断"+ishasRole);
    
    boolean ishasAllRole=subject.hasAllRoles(Arrays.asList("role1","role2"));
    System.out.println("多个角色判断"+ishasAllRole);
//    使用check方法进行授权,若授权不通过会抛出异常
//    subject.checkRole("role3131");    
//    基于资源的的授权
//    isPermitted传入资源标识符
    boolean isPermitted=subject.isPermitted("user:create");
    System.out.println("单个资源判断:"+isPermitted);
    
    
    boolean isPermittedAll=subject.isPermittedAll("user:create","user:update");
    System.out.println("多个资源判断:"+isPermittedAll);
    
//    使用check方法进行授权,若授权不通过会抛出异常
    subject.checkPermission("items:create:1");
    
    }
View Code

自定义realm进行授权

 

 需求

 

上边的程序通过shiro-permission.ini对权限信息进行静态配置,实际开发中从数据库中获取权限数据。就需要自定义realm,由realm从数据库查询权限数据。

 

realm根据用户身份查询权限数据,将权限数据返回给authorizer(授权器)。

 自定义realm

 

 

在原来自定义的realm中,修改doGetAuthorizationInfo方法。

技术分享图片

shiro-realm.ini

在shiro-realm.ini中配置自定义的realm,将realm设置到securityManager中。

技术分享图片

测试程序

技术分享图片

授权流程

1.对subject进行授权,调用方法isPermitted(“permission串”)

2.SecurityManager执行授权,通过ModularRealmAuthrizer执行授权

3.ModularRealmAuthrizer执行realm(自定义的CustomRealm)从数据库查询权限数据

 调用realm的授权方法:doGetAuthorizationInfo

4.realm从数据库查询权限数据,返回ModularRealmAuthrizer

5.ModularRealmAuthrizer调用PermissionResolver进行权限串比对

6.如果比对后,isPermitted"permission"realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常

 

 

以上是关于Shiro授权的主要内容,如果未能解决你的问题,请参考以下文章

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

如何仅使用 Apache Shiro 进行授权?

Shiro安全框架——快速入门登录拦截用户认证请求授权

006-shiro授权

Apache Shiro学习----授权

SpringBoot实现基于shiro安全框架的,配合thymeleaf模板引擎的用户认证和授权