Shiro为我们暴露的认证授权组件Subject,为我们提供了当前用户、角色和授权的相关信息,并且允许我们在实际项目中通过以下三种方式进行调用(当然最终的认证授权部分的还是Subject通过SecurityManager调用具体实现的realm进行判定):
1、编程式授权(当然在实际的生产环境中很少使用)
1) 直接通过角色的访问控制(即调用数据库查看当前subject对应的用户是否具有某一角色即可,只是shiro在该部分有并发控制)
2) 基于角色的访问控制
2、注解式授权
@RequiresAuthentication
要求当前Subject已经在session中验证通过(验证当前用户是否登录:subject.isAuthenticated() 结果为true)
@RequiresUser
验证用户是否被记忆,user有两种含义:
1) 一种是成功登录的(subject.isAuthenticated() 结果为true);
2) 另外一种是被记忆的(subject.isRemembered()结果为true)。
@RequiresGuest
用户没有登录认证或被记住过,验证是否是一个guest的请求,与@RequiresUser完全相反。换言之,RequiresUser == !RequiresGuest。此时subject.getPrincipal() 结果为null.
@RequiresPermissions
验证用户是否具有一个或多个权限,该注解将会经常在项目中使用,如果不满足条件则抛出AuthorizationException异常
1) 是否具有某一权限@RequiresPermission("account:create")
2) 是否具有多个权限@RequiresPermission({"account:create","account:update"})
@RequiresRoles
验证当前用户是否具有某角色,与验证权限类似
3、Jsp标签授权
首先需要导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
guest
guest标签(与@RequiresGuest对应)
<shiro:guest>
欢迎游客访问,<a href="${pageContext.request.contextPath}/login.jsp">登录</a>
</shiro:guest>
user
user标签(与@RequiresUser对应)
authenticated
authenticated标签,用户登录(不包括记住我功能登录)
notAuthenticated
notAuthenticated标签,用户未登录(记住我功能也算未登录)
principal
principal标签 显示用户身份信息,默认调用Subject.getPrincipal()获取,即Primary Principal
<shiro:principal type="java.lang.String"/> 相当于Subject.getPrincipals().oneByType(String.class)
<shiro:principal property="username"/> 相当于((User)Subject.getPrincipals()).getUsername()
hasRole
hasRole标签 (与@RequiresRoles对应)
<shiro:hasRole name="update">
<a href="..............">修改</a>
</shiro:hasRole>
lacksRole
lacksRole标签 当前用户没有任何角色则显示标签体中的内容
hasAnyRoles
hasAnyRoles标签 当前用户拥有任何一个角色则显示标签体中的内容
hasAllRoles
hasAllRoles标签 当前用户拥有指定的所有角色则显示标签体中的内容
hasPermission
hasPermission标签 (与@RequiresPermissions对应)
lacksPermission
lacksPermission标签 当前用户拥有任何一个权限则显示标签体中的内容
hasAnyPermissions
hasAnyPermissions标签 当前用户拥有任何一个权限则显示标签体中的内容
hasAllPermissions
hasAllPermissions标签 当前用户拥有指定的所有权限则显示标签体中的内容,一个或多个角色和权限的在项目中会经常使用,例如:
<zhang:hasAllRoles name="admin,user">
用户[<shiro:principal/>]拥有角色admin和user<br/>
</zhang:hasAllRoles>
<zhang:hasAllPermissions name="user:create,user:update">
用户[<shiro:principal/>]拥有权限user:create和user:update<br/>
</zhang:hasAllPermissions>
<zhang:hasAnyPermissions name="user:create,abc:update">
用户[<shiro:principal/>]拥有权限user:create或abc:update<br/>
</zhang:hasAnyPermissions>