1.shiro权限注解
注解可以放在controller对应的方法上,也可以放在service层对应的方法上。
@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.1简单实验
(1)编写ShiroService.java
@Service
public class ShiroService {
@RequiresRoles({"admin"})
public void testMethod(){
System.out.println("testMethod, time: " + new Date());
Session session = SecurityUtils.getSubject().getSession();
Object val = session.getAttribute("key");
System.out.println("Service SessionVal: " + val);
}
}
(2)编写controller
@Autowired
private ShiroService shiroService;
@RequestMapping("/testShiroAnnotation")
public String testShiroAnnotation(HttpSession session){
session.setAttribute("key", "value12345");
shiroService.testMethod();
return "redirect:/list.jsp";
}
(3)为方便起见,在list.jsp中测试。
<br><br>
<a href="shiro/testShiroAnnotation">Test ShiroAnnotation</a>
测试结果:
当我们使用admin登录时,我们可以点击测试。当我们使用user登录时,会报错误。
1.2注意事项
(1)可能会出现shiro注解失效的问题,解决方法就是在springmvc的配置文件中加上如下配置:
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
(2)在实际开发的时候,我们往往在service上面加上支持事务的注解,这个时候service已经是一个代理对象了。如果我们还在这里添加shiro的注解就不好用了,故在这种情况下应该加在controller上,否则会出现异常。
2.shiro会话管理
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。
在1.1实验中,已经含有session的简单实验(下图为控制台的打印)。这里我们在controller中使用的是http session,而在service中使用shiro session获取,这给我们提供了一个思路,我们在service中可以获得controller中的数据,这也是shiro session的一个重要的应用场景。
参考:尚硅谷