【原创文章,转载请注明出处】
上一节写到了请求控制拦截,这节我们讲讲怎么加入权限控制。
(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个小时进行编写,实在不易呀,打赏,点赞,评论,转发下。
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
从零开始学Spring Boot,Shiro教程,PDF电子书!2合一下载
Spring Boot整合Shiro搭建权限管理系统.pdfSpring Boot整合Shiro搭建权限管理系统.pdfSpring Boot整合Shiro搭建权限管理系统.pdfSpring Boot整合Shiro搭建权限管理系统.pdfSpring Boot整合Shiro搭建权限管理系统....
Spring Boot整合Shiro搭建权限管理系统.docxSpring Boot整合Shiro搭建权限管理系统.docxSpring Boot整合Shiro搭建权限管理系统.docxSpring Boot整合Shiro搭建权限管理系统.docxSpring Boot整合Shiro搭建权限管理系统...
Spring Boot学习之Shiro源码【学习狂神说,自己手动书写,可以实现正常所需的功能】 Spring Boot学习之Shiro源码【学习狂神说,自己手动书写,可以实现正常所需的功能】 Spring Boot学习之Shiro源码【学习狂神说,...
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2299732
Spring Boot整合Shiro搭建权限管理系统教学提纲.docxSpring Boot整合Shiro搭建权限管理系统教学提纲.docxSpring Boot整合Shiro搭建权限管理系统教学提纲.docxSpring Boot整合Shiro搭建权限管理系统教学提纲....
Spring Boot整合Shiro搭建权限管理系统教学提纲.pdfSpring Boot整合Shiro搭建权限管理系统教学提纲.pdfSpring Boot整合Shiro搭建权限管理系统教学提纲.pdfSpring Boot整合Shiro搭建权限管理系统教学提纲.pdfSpring ...
Spring Boot整合Shiro.zip
Spring Boot整合Shiro.zip
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2299777
spring boot+shiro 权限认证管理案例 shiro搭配缓存处理
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2299784
本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能
Spring Boot整合Shiro搭建的一套简单的权限管理系统,里面介绍了Shiro的基本用法,里面附上了代码,环境需要自己搭建(里面有图说明怎么搭建环境的),里面的代码直接复制粘贴就可以运行。感谢大家下载!
转载的shiro_spring boot