`

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

阅读更多

 

【视频&交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

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

在看此篇博客之前您可能需要先看下上面的博客:

Spring BootShiro无状态1)【从零开始学Spring Boot

       好了不废话了,看看这节的大纲:

 
(1)集成Shiro的基本配置;
(2)怎么配置无状态?;
(3)怎么测试是无状态设置成功了呢?

 

       接下来看看具体的步骤吧。

1)集成Shiro的基本配置

       Spring 继承Shiro最简单的配置就是需要注入ShiroFilterFactoryBeanDefaultWebSecurityManager。我们新建一个ShiroConfiguration类,代码如下:

package com.kfit.config;

 

 

import org.apache.shiro.mgt.SecurityManager;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

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);

       return factoryBean;

    }

   

    /**

     * shiro安全管理器:

     * 主要是身份认证的管理,缓存管理,cookie管理,

     * 所以在实际开发中我们主要是和SecurityManager进行打交道的

     * @return

     */

    @Bean

    public DefaultWebSecurityManager securityManager() {

        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

        return securityManager;

    }

   

}

       以上只是集成的基本配置,实际上配置完之后还没啥鸟用,接下来才是重点呢。

 

2)怎么配置无状态?

       对于无状态的配置,我们需要知道,我们要配置如下几个地方:

第一:SubjectContext在创建的时候,需要关闭session的创建,这个主要是由DefaultWebSubjectFactorycreateSubject进行管理。

第二: 需要禁用使用Sessions 作为存储策略的实现,这个主要由securityManagersubjectDaosessionStorageEvaluator进行管理的。

第三:需要禁用掉会话调度器,这个主要由sessionManager进行管理。

       那么我们需要先定义一个StatelessDefaultSubjectFactory类,此类继承于DefaultWebSubjectFactory,我们重写createSubject的方法,通过SubjectContext关闭session的创建,具体实现代码如下:

package com.kfit.config;

 

import org.apache.shiro.subject.Subject;

import org.apache.shiro.subject.SubjectContext;

import org.apache.shiro.web.mgt.DefaultWebSubjectFactory;

/**

 *

 通过调用context.setSessionCreationEnabled(false)表示不创建会话;如果之后调用

Subject.getSession()将抛出DisabledSessionException异常。

 

 * @author Angel --守护天使

 * @version v.0.1

 * @date 2017225

 */

public class StatelessDefaultSubjectFactory extends DefaultWebSubjectFactory{

    @Override

    public Subject createSubject(SubjectContext context) {

       //不创建session.

       context.setSessionCreationEnabled(false);

    System.out.println("shiro.config.subjectFactory.createSubject.SessionCreationEnabled.false");

       return super.createSubject(context);

    }

   

}

       接下来我们要调整下ShiroConfiguration,首先我们要注入StatelessDefaultSubjectFactory;其次就是将StatelessDefaultSubjectFactory交给DefaultWebSecurityManager进行管理;最后使用securityManager获取到subjectDao禁用session的存储策略,具体代码如下。(注意新加的代码为:Add.2.x

package com.kfit.config;

 

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.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.apache.shiro.web.mgt.DefaultWebSubjectFactory;

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);

       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());

       

        /*

         * 禁用使用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;

    }

   

}

 

此时代码到这里的话,我们的session就是被关闭了。

 

3)怎么测试是无状态设置成功了呢

       关说不测,不是好程序员,哈哈,我们还是要亲眼看见报错才能知道我们的代码才是正确了。

       测试原理:如果是无状态的话,那么在调用代码:currentUser.getSession()是会抛出异常的。所以很好测试,直接在HellController中加入如下方法即可测试,代码如下:

   

    /**

     * 此方法执行的时候,会抛出异常:

     * Session creation has been disabled for the current subject.

     * @param session

     * @return

     */

    @RequestMapping("/hello3")

    public String hello3(){

       Subject currentUser = SecurityUtils.getSubject(); 

       Session session = currentUser.getSession();

       System.out.println(session);

       return"hello3,Andy";

    }

在浏览器中访问http://127.0.0.1:8080/hello3

正确的情况下是会抛出异常信息:

 

Session creation has been disabled for the current subject.

 

【视频&交流平台】

à Spring Boot实战篇之Shiro

http://study.163.com/course/introduction.htm?courseId=1004523002

 

à Spring Boot交流平台

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(静态资源使用)

9kaptcha(验证码库)

 

课程目录

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 验证码

 

 

分享到:
评论
1 楼 d292222100 2017-07-27  
Add.2.4的代码
    /**
     * Add.2.4
     * session管理器:
     * sessionManager通过sessionValidationSchedulerEnabled禁用掉会话调度器,
     * 因为我们禁用掉了会话,所以没必要再定期过期会话了。
     * @return
     */
    @Bean
    public DefaultSessionManager sessionManager(){
       DefaultSessionManager sessionManager = new DefaultSessionManager();
       sessionManager.setSessionValidationSchedulerEnabled(false);
       return sessionManager;
    }

在运行时会抛出警告: The org.apache.shiro.web.mgt.DefaultWebSecurityManager implementation expects SessionManager instances that implement the org.apache.shiro.web.session.mgt.WebSessionManager interface.  The configured instance is of type [org.apache.shiro.session.mgt.DefaultSessionManager] which does not implement this interface..  This may cause unexpected behavior.
将DefaultSessionManager的实例对象替换成DefaultSessionManager的子类DefaultWebSessionManager就好了
    /**
     * Add.2.4
     * session管理器:
     * sessionManager通过sessionValidationSchedulerEnabled禁用掉会话调度器,
     * 因为我们禁用掉了会话,所以没必要再定期过期会话了。
     * @return
     */
    @Bean
    public DefaultSessionManager sessionManager(){
       DefaultSessionManager sessionManager = new DefaultWebSessionManager();
       sessionManager.setSessionValidationSchedulerEnabled(false);
       return sessionManager;
    }

相关推荐

    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搭建权限管理系统 (2).pdf

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

    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

    2. **配置Shiro**:在Spring Boot的配置文件(application.properties或application.yml)中,我们可以配置Shiro的相关属性,如RememberMe的密钥、session超时时间等。 3. **创建Shiro配置类**:在Spring Boot项目...

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

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

    Spring Boot整合Shiro.zip

    2. **Spring Boot集成Shiro的步骤** - **添加依赖**:在`pom.xml`中引入Shiro和相关的Spring Boot starter依赖。 - **创建Shiro配置**:编写`ShiroConfig`类,配置Shiro的 Realm、过滤器链等。 - **自定义Realm**...

    从零开始学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