`

106.4 Spring Boot之Shiro无状态(4)【从零开始学Spring Boot】

阅读更多

 

 

【原创文章,转载请注明出处】

上一节写到了请求控制拦截,这节我们讲讲怎么加入权限控制。

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 2017225

 */

@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";

   }

       到这里就可以进行测试下,正确的测试地址:

http://127.0.0.1:8080/hello4?username=admin&params1=love&params2=girl&digest=df7f1595bd5682638556072c8ccde5edadcd807a829373d21af38fb1bc707da7

       错误的测试地址:http://127.0.0.1:8080/hello4?username=zs&params1=love&params2=girl&digest=df7f1595bd5682638556072c8ccde5edadcd807a829373d21af38fb1bc707da7

       会报错:.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

分享到:
评论
5 楼 jsx112 2017-09-13  
博主,报错的连接休整下摘要:
http://127.0.0.1:8080/hello4?username=zs&params1=love&params2=girl&digest=910db60038a1929003d6d719c487310188a8550b928f541cd78043e783017ca1
4 楼 淡淡的伤你 2017-04-06  
    
3 楼 飞天0407 2017-03-02  
林祥纤 写道
飞天0407 写道
博主,项目运行报错如下:
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

不知道您是否遇到


No SecurityManager accessible to the calling code:

是不是少了SecurityManager ,另外你加@Bean了嘛,还有可能报错就是加入热部署了,先去掉试试。

@Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

        securityManager.setSubjectFactory(subjectFactory());

        securityManager.setSessionManager(sessionManager());

        securityManager.setRealm(statelessRealm());

        ((DefaultSessionStorageEvaluator)((DefaultSubjectDAO)securityManager.getSubjectDAO()).getSessionStorageEvaluator()).setSessionStorageEnabled(false);

        return securityManager;
    }

securityManager已经加入的,并且把热部署已经去除,还是报错。检查了代码,都一样啊,博主确定已经测试通过了是吧?
2 楼 林祥纤 2017-03-01  
飞天0407 写道
博主,项目运行报错如下:
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

不知道您是否遇到


No SecurityManager accessible to the calling code:

是不是少了SecurityManager ,另外你加@Bean了嘛,还有可能报错就是加入热部署了,先去掉试试。
1 楼 飞天0407 2017-03-01  
博主,项目运行报错如下:
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

不知道您是否遇到

相关推荐

    一、ERA5数据下载,deepseek提问全图

    一、ERA5数据下载,deepseek提问全图

    UE5 MQTT通信插件

    UE5 MQTT通信插件

    【vue】基于 Vue3 + Element Plus 实现,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM 等功能_pgj.zip

    【vue】基于 Vue3 + Element Plus 实现,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM 等功能_pgj

    matlab模仿吃豆人游戏.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于C#语言的智能诊断交付系统插件设计源码

    该项目为基于C#语言的智能诊断交付系统插件设计源码,总计包含122个文件,涉及多种类型,包括70个元数据文件、26个C#源代码文件、6个预制体文件、5个材质文件、3个着色器文件、3个Unity脚本文件、2个汇编定义文件、1个Cginc文件、1个Markdown文件、1个光照文件。该系统专注于智能诊断交付,旨在提升诊断交付的效率和准确性。

    Python算法:有序数组去重并限制元素最多出现两次

    内容概要:本文探讨了一个经典的数组操作问题——在一个已经排序的数组中去除多余的重复元素,确保每个元素最多出现两次。该问题要求算法在原地执行(不引入新的数据结构),并且仅消耗O(1)的额外存储空间。文中详细展示了问题的要求与挑战,给出具体的示例帮助理解,并明确指出了解题思路和预期效果。 适用人群:面向有一定编程经验的学习者或者初涉Python开发的语言爱好者,尤其是对算法有兴趣的人群。 使用场景及目标:适用于那些希望提升自己数据处理技巧,特别是有关列表、数组的操作技能的人。该方法可以在内存有限的情况下进行高效的去重处理,比如嵌入式系统或者大规模数据分析环境。 其他说明:该算法主要运用双指针(快慢指针)的方法,在遍历数组的同时实现对原始数据的部分覆盖来达到减少重复项目的目的,同时也提醒使用者注意'引用'特性可能引起的潜在误解。

    8x8的国际象棋棋盘Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    数据集 + 标题 深海沉积物岩心GeoB17603-2的文档记录

    深海沉积物岩心GeoB17603-2的文档记录 内容 该文献由Lucchi RG、Sabbatini A、Nicolaisen LS等人于2014年发布,主要描述了深海沉积物岩心GeoB17603-2的相关信息。具体内容涉及岩心的采集情况及其详细特征等。读者可通过访问"此链接" ()获取更多关于该数据集的信息。遗憾的是,目前尚未提供该数据集的具体大小。

    基于JavaScript、HTML、TypeScript的node.js学习资源与设计源码分享

    本项目为Node.js学习资源集,包含41个文件,涵盖26个JavaScript文件、4个HTML文件、3个JSON文件、3个文本文件、2个Markdown文件、1个Git忽略文件、1个PNG图像文件、1个TypeScript文件。内容丰富,涉及Node.js学习的各个方面,旨在帮助开发者掌握相关技能。

    VAR模型预测马来西亚_美国外汇汇率Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于Matlab的制作双曲线和摆线.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于Vue和JavaScript的图片对比效果输入范围切换设计源码

    本项目是一个基于Vue框架和JavaScript的前端样式设计源码,专注于实现图片对比效果,通过input range控件实现风格切换。该项目包含87个文件,其中SVG文件48个,JavaScript文件16个,Vue文件8个,JPG图片文件5个,JSON文件3个,开发配置文件1个,生产配置文件1个,Git忽略文件1个,Markdown文件1个,HTML文件1个。项目适用于需要展示和比较不同图片风格的场景。

    MAX30102心率血样传感器原理图.pdf

    MAX30102心率血样传感器原理图

    Python-Excel选表头列key-value-转json文件

    资源名称:Python—Excel选表头列key-value-转json文件 类型:windows—exe可执行工具 环境:Windows10或以上系统 功能: 1. 点击按钮【选择文件】:选择一个Exel文件(默认第一行为表头) 2. 点击选择key列(可多选-多个中间用“=”隔开) 3. 点击选择value列(可多选-多个中间用“=”隔开) 4. 点击按钮【选择文件】:保存路径 5. 点击按钮【转换并保存】:保存路径 优点: 1、非常快的速度! 2、已打包—双击即用!无需安装! 3、自带GUI界面方便使用!

    基于HTML、JavaScript、CSS的个人作品集设计源码

    该项目是一个个人作品集设计源码,采用HTML、JavaScript和CSS技术构建,包含50个文件,其中包括12个HTML文件、10个JavaScript文件、9个JPG图片文件、6个PNG图片文件、4个CSS样式表文件、3个SVG矢量图形文件、以及各种字体文件,如EOT、TTF、WOFF和WOFF2等。该作品集旨在展示个人设计作品,适合个人网站或在线展示使用。

    基于C语言及多语言集成的智能仓储安防控制系统设计源码

    该项目是一款基于C语言核心开发,并融合HTML、CSS、Python等多语言技术的智能仓储安防控制系统源码。项目包含360个文件,其中225个为头文件(.h),32个为C语言源文件(.c),27个为压缩文件(.gz),8个为共享库文件(.so),7个为静态库文件(.a),6个为配置文件(.1, .pc, .cmake)和3个XML文件(.xml)。该系统旨在提供智能化的仓储安防解决方案。

    .NET鱼码grant.dll v2.0.3.zip

    鱼码grant.dll是一个简单易用的标准DLL,让软件开发者快速为自己软件加上注册码,支持在线和离线授权,实现商用授权许可。鱼码可以让开发者快速为自己软件加上软件升级功能 软件托管,0成本搭建平台,在线销售自己软件,管理授权码。 dll使用说明可进入演示地址进行查看。 安装: 1、下载dll注册成开发者 2、调用dll里check_grant函数 3、会员中心管理自己授权码发放或过期、删除等操作 软件有vb、vb.net、vc、vc.net、易语言和Delphi示例,压缩包中的为vb.net的,如果需要其他版本的demo请到官网进行下载。

    乡村小道图像分割系统:智能化检测.zip

    乡村小道图像分割系统:智能化检测

    物业管理领域的新碧彩SaaS平台:微服务架构下的多租户管理模式优化采购业务

    内容概要:本文介绍了新碧彩SaaS平台项目的特点及其建设优势。新碧彩SaaS平台采用了云托管方式部署,利用微服务架构进行业务拓展,统一接口管理和多租户模式以降低运营成本、提高灵活性。通过集群部署及专业的运维团队,保障租户使用的稳定性、安全性、高效率。平台实现了采购业务全流程的规范化管理及优化。同时支持快速扩展各类业务应用,包括财务管理、办公自动化、人力资源等多个方面。 适合人群:对于物业公司或其他相关行业的技术人员、管理者及关注企业数字化转型的从业者。 使用场景及目标:①解决现有采购管理系统难以适应快速增长的企业规模和发展需求的问题;②通过引入新技术提升管理水平和服务质量;③实现业务处理流程化、数据化的目标,并能轻松对接第三方服务商的数据接口服务。 其他说明:本文详细阐述了如何借助现代化信息技术手段,助力企业转型升级为智能型企业,特别是在当前中国物业管理市场背景下尤为重要。此外还提到平台未来可能会继续围绕用户体验改进功能特性,如提供更多增值服务等。

    基于Java开发的在线书城设计源码

    该项目为基于Java开发的在线书城设计源码,包含55个文件,涵盖41个Java源文件、10个XML配置文件、2个Git忽略文件、1个YAML文件和1个TXT文件。

Global site tag (gtag.js) - Google Analytics