Shiro安全框架(四)——权限认证

Shiro权限认证

1、权限认证核心要素
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色,用户

用户:在shiro中,代表访问系统的用户,即Subject。
角色:是权限的集合,一个角色可以包含多个权限。
权限:操作资源的权利,如访问某个页面,及某个模块的数据的添加,修改 ,删除,查看的权利。

2、授权
1)编程式授权

  • a)基于角色的访问控制
  • b)基于权限的访问控制

2)注解式授权
@RequiresAuthentication 要求当前Subject 已经在当前的session 中被验证通过才能被访问或调用。

@RequiresGuest 要求当前的Subject 是一个"guest",也就是说,他们必须是在之前的session 中没有被验证或被记住才能被访问或调用。

@RequiresPermissions(“account:create”) 要求当前的Subject 被允许一个或多个权限,以便执行注解的方法。

@RequiresRoles(“administrator”) 要求当前的Subject 拥有所有指定的角色。如果他们没有,则该方法将不会被执行,而且AuthorizationException 异常将会被抛出。

@RequiresUser RequiresUser 注解需要当前的Subject 是一个应用程序用户才能被注解的类/实例/方法访问或调用。一个“应用程序用户”被定义为一个拥有已知身份,或在当前session 中由于通过验证被确认,或者在之前session 中的’RememberMe’服务被记住。

3)Jsp标签授权
<%@ taglib prefix=“shiro” uri=“http://shiro.apache.org/tags” %>
Guest 标签:用户没有身份验证时显示相应信息,即游客访问信息;

User 标签:用户已经身份验证/记住我登录后显示相应的信息;

Authenticated 标签:用户已经身份验证通过,即Subject.login 登录成功,不是记住我登录的。

notAuthenticated 标签:用户没有身份验证通过,即没有调用Subject.login 进行登录,包括记住我自动登录的也属于未进行身份验证。

principal 标签显示用户身份信息,默认调用Subject.getPrincipal()获取,即Primary Principal。

hasRole 标签如果当前Subject 有角色将显示body 体内容。

lacksRole 标签如果当前Subject 没有角色将显示body 体内容。

hasAnyRoles 标签如果当前Subject 有任意一个角色(或的关系)将显示body 体内容。

hasPermission 标签如果当前Subject 有权限将显示body 体内容。

lacksPermission 标签如果当前Subject 没有权限将显示body 体内容

基于权限的身份判断

单个权限:query
单个资源多个权限:user:query,user:add 多值user:query,add
单个资源所有权限:user:query,add,update,delete =user:*
所有资源某个权限::view
实例级别的权限控制
单个实例的单个权限:printer:query:lp7200, printer:print:epsoncolor
所有实例的单个权限:printer:print:

所有实例的所有权限:printer::
单个实例的所有权限:printer:*:lp7200
单个实例的多个权限:printer:query,print:lp7200

1.在resources目录下创建配置文件,shiro_permissopn.ini,用于描述用户的登录信息以及角色和权限信息。

[users]
muma=123,role1
admin=123,role1,role2

[roles]
role1=user:select
role2=user:add,user:update,user:delete,user:select

2.创建ShiroTest测试类

import org.apache.shiro.subject.Subject;

public class ShiroTest4 {
    public static void main(String[] args) {
        Subject subject = ShiroUtils.login("classpath:shiro_permission.ini","admin", "123");
        //单个权限的判断
        System.out.println(subject.isPermitted("user:add")?"有user:add权限":"没有user:add权限");
        System.out.println(subject.isPermitted("user:delete")?"有user:delete权限":"没有user:delete权限");
        System.out.println(subject.isPermitted("user:update")?"有user:update权限":"没有user:update权限");
        System.out.println(subject.isPermitted("user:select")?"有user:select权限":"没有user:select权限");
        //多个权限的判断
        boolean[] permitted = subject.isPermitted("user:add", "user:delete","user:update","user:select");
        for (int i=0;i<permitted.length;i++){
            System.out.println(permitted[i]);
        }
    }
}

3.测试结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值