【视频 & 交流平台】
http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share
http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share
https://gitee.com/happyangellxq520/spring-boot
http://412887952-qq-com.iteye.com/blog/2321532
【原创文章,转载请注明出处】
上一节写到了请求控制拦截,这节我们讲讲怎么加入权限控制。
(1)如何权限控制呢?
权限控制就比较简单了,主要需要操作两步:
其一就是,在shiroConfiguration中加入【开启shiro aop注解支持】和【自动代理所有的advisor】,具体代码如下:
package com.kfit.config;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
import org.apache.shiro.mgt.DefaultSubjectDAO;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.DefaultSessionManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.mgt.DefaultWebSubjectFactory;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* shiro配置类.
* @author Angel --守护天使
* @version v.0.1
* @date 2017年2月25日
*/
@Configuration
public class ShiroConfiguration {
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
//Add.4.2.start
factoryBean.getFilters().put("statelessAuthc", statelessAuthcFilter());
//拦截器.
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
filterChainDefinitionMap.put("/**", "statelessAuthc");
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
//Add.4.2.end
return factoryBean;
}
/**
* shiro安全管理器:
* 主要是身份认证的管理,缓存管理,cookie管理,
* 所以在实际开发中我们主要是和SecurityManager进行打交道的
* @return
*/
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//Add.2.2
securityManager.setSubjectFactory(subjectFactory());
//Add.2.5
securityManager.setSessionManager(sessionManager());
//Add.4.4
securityManager.setRealm(statelessRealm());
/*
* 禁用使用Sessions 作为存储策略的实现,但它没有完全地禁用Sessions
* 所以需要配合context.setSessionCreationEnabled(false);
*/
//Add.2.3
((DefaultSessionStorageEvaluator)((DefaultSubjectDAO)securityManager.getSubjectDAO()).getSessionStorageEvaluator()).setSessionStorageEnabled(false);
return securityManager;
}
/**
* Add.2.1
* subject工厂管理器.
* @return
*/
@Bean
public DefaultWebSubjectFactory subjectFactory(){
StatelessDefaultSubjectFactory subjectFactory = new StatelessDefaultSubjectFactory();
return subjectFactory;
}
/**
* Add.2.4
* session管理器:
* sessionManager通过sessionValidationSchedulerEnabled禁用掉会话调度器,
* 因为我们禁用掉了会话,所以没必要再定期过期会话了。
* @return
*/
@Bean
public DefaultSessionManager sessionManager(){
DefaultSessionManager sessionManager = new DefaultSessionManager();
sessionManager.setSessionValidationSchedulerEnabled(false);
return sessionManager;
}
/**
* Add.4.3
* 自己定义的realm.
* @return
*/
@Bean
public StatelessAuthorizingRealm statelessRealm(){
StatelessAuthorizingRealm realm = new StatelessAuthorizingRealm();
return realm;
}
/**
* Add.4.1
* 访问控制器.
* @return
*/
@Bean
public StatelessAccessControlFilter statelessAuthcFilter(){
StatelessAccessControlFilter statelessAuthcFilter = new StatelessAccessControlFilter();
return statelessAuthcFilter;
}
/**
* Add.5.1
* 开启shiro aop注解支持.
* 使用代理方式;所以需要开启代码支持;
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
/**
* Add.5.2
* 自动代理所有的advisor:
* 由Advisor决定对哪些类的方法进行AOP代理。
*/
@Bean
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
daap.setProxyTargetClass(true);
returndaap;
}
}
第二步在helloController添加一个新的测试方法,在方法中加入注解:@RequiresRoles("admin")即可,部分代码如下:
@RequestMapping("/hello4")
@RequiresRoles("admin")
// @RequiresPermissions("userInfo:add")//权限管理;
public String hello4(){
return "hello4,Andy";
}
到这里就可以进行测试下,正确的测试地址:
会报错:.UnauthorizedException: Subject does not have role [admin]
好了,shiro无状态编程就到此为此了,花了博主2个小时进行编写,实在不易呀,打赏,点赞,评论,转发下。
-->关注微信公众号获取最新资讯:
【视频&交流平台】
http://study.163.com/course/introduction.htm?courseId=1004523002
http://412887952-qq-com.iteye.com/blog/2321532
======================================
Spring Boot Shiro视频实战篇【已更新】
======================================
适合人群
有Spring Boot基础的人群。
使用技术
(1)spring boot(整合框架)
(2)spring mvc
(3)spring data jpa(持久化操作)
(4)shiro(安全框架)
(5)thymeleaf(模板引擎)
(6)ehcache(缓存管理)
(7)mysql(数据库)
(8)js/css/img(静态资源使用)
(9)kaptcha(验证码库)
课程目录
1. Spring Boot Shiro介绍
2. Spring Boot 搭建无Shiro的框架
3. Spring Boot Shiro拦截
4. Spring Boot Shiro身份认证准备工作
5. Spring Boot Shiro身份认证
6. Spring Boot Shiro权限控制
7. Spring Boot Shiro缓存
8. Spring Boot Shiro记住密码
9. Spring Boot Shiro登录成功之后下载favicon.ico
10. Spring Boot 在thymeleaf使用shiro标签
11. Spring Boot Shiro密码加密算法
12.Spring Boot Shiro使用JS-CSS-IMG
13. Spring Boot Shiro限制登录尝试次数
14.Spring Boot Shiro 验证码