Shiro Subject详解

Shiro中认证授权组件Subject,为我们提供了当前用户、角色和授权的相关信息,可以进行登录,退出,权限验证,获取用户信息,session.。通常我们会将Subject对象理解为一个用户,同样的它也有可能是一个三方程序,它是一个抽象的概念,可以理解为任何与系统交互的“东西”都是Subject。

获取Subject

Subject subject = SecurityUtils.getSubject(); 

通过SecurityUtils.getSubject()可以获得当前的Subject

subject主要接口

Subject login(Subject subject, AuthenticationToken authenticationToken) throws AuthenticationException;    //登陆
void logout(Subject subject);        //退出登陆
Subject createSubject(SubjectContext context);    //获取subject

subject作用

1. 获得Session对象

Session session = subject.getSession();
session.setAttribute( "key", "aValue" );

这里的Session并不是HttpSession,而是shiro为我们提供的,它的操作与HttpSession一样,他们最大的区别就是shiro session不需要依赖http服务器。

2. 得到当前登录的用户名

String currentUser = subject.getPrincipal().toString();
System.out.println("当前登录的用户是:"+currentUser);

3. 校验当前用户的权限

//判断用户是否是拥有某种角色
boolean isRole = subject.hasRole( "admin" );
//是否拥有某种功能
boolean isPer = subject.isPermitted("xiaoming:run");

4. 退出登录

//退出登录
subject.logout();

注解式授权

1. @RequiresAuthentication

要求当前Subject已经在session中验证通过(验证当前用户是否登录:subject.isAuthenticated() 结果为true)

2. @RequiresUser

验证用户是否被记忆

3. @RequiresGuest

用户没有登录认证或被记住过,验证是否是一个guest的请求,与@RequiresUser完全相反。换言之,RequiresUser == !RequiresGuest。此时subject.getPrincipal() 结果为null.

4. @RequiresPermissions

验证用户是否具有一个或多个权限,该注解将会经常在项目中使用,如果不满足条件则抛出AuthorizationException异常

5. @RequiresRoles

验证当前用户是否具有某角色,与验证权限类似

JSP页面标签授权

页面授权标签包含:

<shiro:authenticated>        登录之后
<shiro:notAuthenticated>        不在登录状态时
<shiro:guest>            用户在没有RememberMe时
<shiro:user>            用户在RememberMe时
<shiro:hasAnyRoles name="abc,123" >    在有abc或者123角色时
<shiro:hasRole name="abc">        拥有角色abc
<shiro:lacksRole name="abc">        没有角色abc
<shiro:hasPermission name="abc">    拥有权限资源abc
<shiro:lacksPermission name="abc">    没有abc权限资源
<shiro:principal>        显示用户身份名称
<shiro:principal property="username"/>         显示用户身份中的属性值

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。