介绍
权限注解的作用就是修饰一个方法,让这个方法只有在当前 Subject
满足一定的条件时才能访问。
@RequiresAuthentication
:当前Subject
已经通过login
进行了身份验证,即Subject.isAuthenticated
方法返回true
时。@RequiresUser
:当前Subject
已经身份验证或通过“记住我”自动登录。@RequiresGuest
:当前Subject
没有身份验证(包含通过“记住我”登录),为游客身份时。@RequiresRoles(value={"admin","user"},logical=Logical.AND)
:当前Subject
需要拥有角色admin
和user
。@RequiresPermissions(value={"user:a","user.b"},logical=Logical.OR)
:当前Subject
需要拥有权限user:a
或user:b
。
使用示例
1、新建测试使用的 Controller 并使用 Shiro 注解:
// com.zze.shiro.controller.TestController
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("testHasRole")
@RequiresRoles({"admin"}) // 只有拥有 admin 角色的用户才可以访问
public String testHasRole() {
System.out.println("from testHasRole");
return "redirect:list.jsp";
}
}
2、修改 list.jsp
:
<!-- list.jsp -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Welcome 【<shiro:principal/>】 <br>
<h3>List Page</h3>
<a href="/user.jsp">user</a> <br>
<a href="/admin.jsp">admin</a><br>
<a href="/logout">logout</a><br>
<a href="/testHasRole">testHasRoleAnno</a>
</body>
</html>
3、测试以 admin
用户登录,访问 localhost:8080/testHasRole
,正常访问。
4、测试以 user
用户登录,访问 localhost:8080/testHasRole
,抛出如下异常:
此时我们就可以通过 SpringMVC 的【全局异常处理】来捕获这个异常,给用户返回友好的页面。
如注解失效,需要将下面配置移到 SpringMVC 核心配置文件中:
<!--
配置 lifecycleBeanPostProcessor,可以自动调用配置在 Spring IOC 容器中 Shiro bean 的生命周期方法
-->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<!--
启用 IOC 容器中使用 Shiro 注解,必须在配置 lifecycleBeanPostProcessor 之后才可使用
-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
评论区