`

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.

不知道您是否遇到

相关推荐

    39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发而闻名,而Shiro则是一个轻量级的安全框架,适用于身份验证、授权、会话管理和安全性相关的...

    39.4 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发能力而备受青睐,而Shiro则是一个轻量级的安全框架,用于实现用户认证、授权和会话管理。...

    spring boot+shiro 权限认证管理案例

    4. `shiro.ini` 或 `shiro.yml`:Shiro 的配置文件,定义了过滤器链和 Realm 设置。 5. `WebSecurityInitializer.java`:初始化 Shiro 过滤器链的配置。 通过以上步骤,我们可以构建一个集成了 Spring Boot 和 ...

    从零开始学Spring Boot与Shiro教程

    在学习过程中,提供的《从零开始学Spring Boot》PDF电子书会详细介绍Spring Boot的各个组件和使用方式,包括自动配置、起步依赖、Actuator监控、外部配置、测试等方面。而《Shiro教程》则会详细阐述Shiro的各个方面...

    spring boot 集成 shiro

    **Spring Boot 集成 Shiro 深度解析** Spring Boot 是一款基于 Spring 的轻量级框架,它简化了 Spring 应用的初始搭建以及开发过程。而 Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和...

    39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot和Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发能力而闻名,而Shiro则是一个强大的安全管理框架,提供了认证、授权、会话管理和安全加密等...

    spring_boot_shiro

    《Spring Boot整合Shiro实战详解》 在现代Java Web开发中,Spring Boot以其简洁的配置、快速的开发体验,已经成为主流框架。而Apache Shiro作为一款强大的安全管理框架,提供了认证、授权、会话管理和安全加密等...

    Spring Boot整合Shiro搭建权限管理系统

    在本文中,我们将探讨如何利用Spring Boot和Apache Shiro构建一个权限管理系统。Spring Boot以其便捷的启动和配置方式,使得快速开发变得简单。而Shiro则是一个轻量级的安全框架,用于实现用户认证和授权。 首先,...

    基于Spring Boot和Shiro框架的权限管理系统.zip

    基于Spring Boot和Shiro框架的权限管理系统 项目简介 本项目是一个基于Spring Boot和Shiro框架的权限管理系统,结合Vue.js实现前后端分离。系统支持按钮接口级别的权限控制,确保用户只能访问其权限范围内的资源。...

    Spring Boot学习之Shiro源码

    Spring Boot学习之Shiro源码【学习狂神说,自己手动书写,可以实现正常所需的功能】 Spring Boot学习之Shiro源码【学习狂神说,自己手动书写,可以实现正常所需的功能】 Spring Boot学习之Shiro源码【学习狂神说,...

    spring boot shiro demo项目

    Spring Boot Shiro Demo项目是一个基于Spring Boot框架与Apache Shiro实现的权限管理示例,旨在帮助开发者快速理解和应用Shiro进行权限控制。相比Spring Security,Shiro通常被认为更易于理解和使用,更适合小型到...

    Spring Boot整合Shiro搭建权限管理系统教学提纲.pdf

    【Spring Boot整合Shiro搭建权限管理系统】 在Java后端开发中,Spring Boot因其简洁的配置和强大的功能,已经成为构建Web应用的首选框架。而Apache Shiro则是一个强大且易用的Java安全框架,用于处理认证、授权、...

    楠哥Spring Boot整合Shiro.zip

    《Spring Boot整合Shiro实战详解》 在Java Web开发领域,Spring Boot以其便捷的配置、快速的启动和强大的集成能力,已经成为主流的框架选择。而Shiro作为一款轻量级的安全框架,它提供了身份验证、授权、会话管理和...

    spring boot+shiro+mybatis实现不同用户登录显示不同的权限菜单

    Spring Boot、Shiro和MyBatis这三大框架的组合提供了一种高效且灵活的方式来实现这一目标。本项目通过集成这三个工具,能够根据用户的登录身份展示不同的权限菜单,确保了用户只能访问他们被授权的功能。 **Spring ...

    Spring Boot整合Shiro搭建权限管理系统 (2).pdf

    首先,让我们从创建一个 Spring Boot 项目开始: 1. 创建 Maven 工程: 使用 Maven 作为构建工具是标准做法,因为它提供了依赖管理和构建自动化功能。新建一个 Maven 项目,并在 `pom.xml` 文件中引入 Spring Boot...

    Spring Boot整合Shiro.zip

    在现代Web开发中,Spring Boot和Apache Shiro是两个非常重要的框架。Spring Boot以其便捷的配置和快速的应用启动而受到广大开发者的喜爱,而Apache Shiro则是一个强大的安全管理框架,负责处理认证、授权、会话管理...

    从零开始学Spring Boot

    1.3 spring boot起步之Hello World 1.4 Spring Boot返回json数据 1.5 Spring Boot热部署 1.6 Spring Boot使用别的json解析框架 1.7 全局异常捕捉 1.8 Spring Boot datasource - mysql 1.9 JPA - Hibernate 1.10 使用...

    Spring Boot整合Shiro搭建权限管理系统教学提纲.docx

    ### Spring Boot整合Shiro搭建权限管理系统知识点解析 #### 一、Spring Boot与Shiro简介 - **Spring Boot**: 是一种简化Spring应用开发的框架,它提供了自动配置、依赖管理等功能,使得开发者能够快速构建独立的...

    Spring Boot 整合 Shiro.docx

    整合Spring Boot与Shiro,首先需要在项目中引入Shiro的相关依赖。在`pom.xml`文件中添加Spring Boot对Shiro的支持,然后配置SecurityManager,并实现自己的Realm以处理认证和授权逻辑。接下来,可以编写过滤器链来...

    Spring Boot整合Shiro搭建权限管理系统.docx

    在开始介绍如何使用Spring Boot整合Shiro搭建权限管理系统之前,我们首先简要回顾一下Spring Boot的基础知识。 ##### 1. 新建一个Maven工程 为了创建一个Spring Boot项目,首先需要使用Maven或者Gradle作为构建...

Global site tag (gtag.js) - Google Analytics