`

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

阅读更多

 à悟空学院: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

 

 

在读此文章之前您还可能需要先了解:

 

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

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

(基本搭建)

 

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

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

(shiro权限引入)

 (39.3) Spring Boot Shiro权限管理【从零开始学Spring Boot】

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

(shiro 缓存)

 

 

(6). Shiro记住密码

      记住密码实现起来也是比较简单的,主要看下是如何实现的。

com.kfit.config.shiro.ShiroConfiguration加入两个方法:

/**

     * cookie对象;

     * @return

     */

    @Bean

    public SimpleCookie rememberMeCookie(){

       System.out.println("ShiroConfiguration.rememberMeCookie()");

       //这个参数是cookie的名称,对应前端的checkboxname = rememberMe

       SimpleCookie simpleCookie = new SimpleCookie("rememberMe");

       //<!-- 记住我cookie生效时间30 ,单位秒;-->

       simpleCookie.setMaxAge(259200);

       returnsimpleCookie;

    }

   

    /**

     * cookie管理对象;

     * @return

     */

    @Bean

    public CookieRememberMeManager rememberMeManager(){

       System.out.println("ShiroConfiguration.rememberMeManager()");

       CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();

       cookieRememberMeManager.setCookie(rememberMeCookie());

       returncookieRememberMeManager;

    }

 

rememberMeManager注入到SecurityManager

@Bean

    public SecurityManager securityManager(){

        DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();

       //设置realm.

       securityManager.setRealm(myShiroRealm());

      

       //注入缓存管理器;

       securityManager.setCacheManager(ehCacheManager());//这个如果执行多次,也是同样的一个对象;

      

       //注入记住我管理器;

       securityManager.setRememberMeManager(rememberMeManager());

      

       returnsecurityManager;

    }

 

ShiroFilterFactoryBean添加记住我过滤器:

@Bean

    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){

       System.out.println("ShiroConfiguration.shirFilter()");

       ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();

      

        // 必须设置 SecurityManager 

       shiroFilterFactoryBean.setSecurityManager(securityManager);

      

      

      

       //拦截器.

       Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();

      

       //配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了

       filterChainDefinitionMap.put("/logout", "logout");

      

      

       //配置记住我或认证通过可以访问的地址

        filterChainDefinitionMap.put("/index", "user");

        filterChainDefinitionMap.put("/", "user");

      

      

       //<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;

        //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->

       filterChainDefinitionMap.put("/**", "authc");

      

       // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面

        shiroFilterFactoryBean.setLoginUrl("/login");

        // 登录成功后要跳转的链接

        shiroFilterFactoryBean.setSuccessUrl("/index");

        //未授权界面;

        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

      

       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

       returnshiroFilterFactoryBean;

    }

 

主要是加入了:

//配置记住我或认证通过可以访问的地址

 filterChainDefinitionMap.put("/index", "user");

 filterChainDefinitionMap.put("/", "user");

 

修改登录界面加入rememberMe复选框:

login.html中加入:

<P><input type="checkbox" name="rememberMe" />记住我</P>

 

这时候运行程序,登录之后跳转到/index页面,然后我们关闭浏览器,然后直接访问/index还是可以访问的,说明我们写的记住密码已经生效了,如果访问http://127.0.0.1:8080/userInfo/userAdd

话还是需要重新登录的。

      至此spring boot集成shiro就真的告一段落了。

当然shiro还是博大精深的,还有很多需要大家去研究,在这里博主抛出几个问题(当然博主自己已经实现了):

问题1如何在登录的时候加入验证码校验;

问题2如何在thymleaf使用shiro标签,比如:shiro:hasPermission

问题3:如何限制密码输错3次就不能登录了;

问题4:如何编写无状态的过滤器;

问题5:在同一个工程中如何有状态和无状态的过滤器同时并存;(这个问题博主还没解决哦,有谁知道怎么解决的,欢迎留言或者加QQ告知,不胜感激)。

  

 

【视频&交流平台】

à悟空学院: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交流平台

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

分享到:
评论
15 楼 林祥纤 2018-03-04  
china494479155 写道

祥哥,我的问题跟3楼一样
1.登陆成功后,再次输入loginUrl,回到登陆页,再输入用户密码,之后登陆不了,有什么可行的解决方案?已经登录过一次,第二次的登录没有触发 doGetAuthenticationInfo 方法,也没有页面跳转。如果是再次进入/index是没有问题的。


这个是已经登录的状态了,需要在前端页面或者后台的login方法做一下处理。
14 楼 china494479155 2018-03-02  

祥哥,我的问题跟3楼一样
1.登陆成功后,再次输入loginUrl,回到登陆页,再输入用户密码,之后登陆不了,有什么可行的解决方案?已经登录过一次,第二次的登录没有触发 doGetAuthenticationInfo 方法,也没有页面跳转。如果是再次进入/index是没有问题的。
13 楼 林祥纤 2017-10-26  
林祥纤 写道
duzj6484 写道
duzj6484 写道
大神,有一个很急的问题。每次走userInfoRepository.findByUsername(username);这个方法上,shiro直接跳出报认证失败,我看了几天了,一直没解决,在查询那块不行我就要用mybitis那一套来实现数据库操作了

可是看着jpa对单表的操作更简单,很想用又不知道为什么


userInfoRepository.findByUsername(username)此方法是否可以返回一个UserInfo对象,

另外确保JPA已经生效了。再不行的话,可以把源码发我邮箱,我有时间可以帮你看看!
JPA应该是生效了,我用CURD里面的findone可以查询到数据,我发现应该是hibernate版本的问题,可我现在并没有解决



-------------------------------
那你降低hibernate版本试试!
12 楼 duzj6484 2017-10-25  
duzj6484 写道
duzj6484 写道
大神,有一个很急的问题。每次走userInfoRepository.findByUsername(username);这个方法上,shiro直接跳出报认证失败,我看了几天了,一直没解决,在查询那块不行我就要用mybitis那一套来实现数据库操作了

可是看着jpa对单表的操作更简单,很想用又不知道为什么


userInfoRepository.findByUsername(username)此方法是否可以返回一个UserInfo对象,

另外确保JPA已经生效了。再不行的话,可以把源码发我邮箱,我有时间可以帮你看看!
JPA应该是生效了,我用CURD里面的findone可以查询到数据,我发现应该是hibernate版本的问题,可我现在并没有解决
11 楼 duzj6484 2017-10-25  
<dependency><groupId>antlr</groupId>
<artifactId>antlr</artifactId>
</dependency>
我用的ecplise4.5,jdk1.8,就运行你的demo的时候报There was an unexpected error (type=Internal Server Error, status=500).
antlr/RecognitionException
我查了网上说的,添加了相应的依赖,还是提示这个错误,您有时间看一下
10 楼 林祥纤 2017-10-24  
duzj6484 写道
duzj6484 写道
大神,有一个很急的问题。每次走userInfoRepository.findByUsername(username);这个方法上,shiro直接跳出报认证失败,我看了几天了,一直没解决,在查询那块不行我就要用mybitis那一套来实现数据库操作了

可是看着jpa对单表的操作更简单,很想用又不知道为什么


userInfoRepository.findByUsername(username)此方法是否可以返回一个UserInfo对象,

另外确保JPA已经生效了。再不行的话,可以把源码发我邮箱,我有时间可以帮你看看!
9 楼 duzj6484 2017-10-24  
duzj6484 写道
大神,有一个很急的问题。每次走userInfoRepository.findByUsername(username);这个方法上,shiro直接跳出报认证失败,我看了几天了,一直没解决,在查询那块不行我就要用mybitis那一套来实现数据库操作了

可是看着jpa对单表的操作更简单,很想用又不知道为什么
8 楼 duzj6484 2017-10-24  
大神,有一个很急的问题。每次走userInfoRepository.findByUsername(username);这个方法上,shiro直接跳出报认证失败,我看了几天了,一直没解决,在查询那块不行我就要用mybitis那一套来实现数据库操作了
7 楼 林祥纤 2016-08-23  
caishancai 写道
验证码如何校验?


研究下shiro 验证码就会了。
6 楼 caishancai 2016-08-22  
验证码如何校验?
5 楼 林祥纤 2016-08-20  
sol0909 写道
你好大神,我的项目是spring boot + oauth2做身份验证和单点登录的,看了你的文章,我想集成shiro的角色权限控制(身份验证oauth2来做),我想用shiro:hasRole标签可是doGetAuthorizationInfo()这个方法进不去,怎么办?还是这种情况不需要shiro?求回复,万分感谢!



这应该是少了一些配置信息,配置如下信息了嘛?


/**
     *  开启shiro aop注解支持.
     *  使用代理方式;所以需要开启代码支持;
     * @param securityManager
     * @return
     */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
       AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
       authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
       return authorizationAttributeSourceAdvisor;
    }

你可以看下(39.2). Spring Boot Shiro权限管理【从零开始学Spring Boot】 这个章节的。
4 楼 sol0909 2016-08-19  
你好大神,我的项目是spring boot + oauth2做身份验证和单点登录的,看了你的文章,我想集成shiro的角色权限控制(身份验证oauth2来做),我想用shiro:hasRole标签可是doGetAuthorizationInfo()这个方法进不去,怎么办?还是这种情况不需要shiro?求回复,万分感谢!
3 楼 Naylor 2016-08-05  
提几个问题
1.登陆成功后,再次输入loginUrl,回到登陆页,再输入用户密码,死后登陆不了,有什么可行的解决方案?
2.登陆成功后,何时使用session记录当前用户信息?
3.shiro session 能否与spring session 兼容?
2 楼 林祥纤 2016-05-22  
hacker10086 写道
看了你的springboot 刚想集成shiro 你就写出来了 哈哈非常厉害 同时我还想集成下cas

呵呵,那你先研究下,有时间我的话,我也会进行编写的。
1 楼 hacker10086 2016-05-22  
看了你的springboot 刚想集成shiro 你就写出来了 哈哈非常厉害 同时我还想集成下cas

相关推荐

    linux-2.6.39.4源码

    稳定免费的linux源码 作为一个开放源代码的操作系统,Linux附带的源代码库使得广大爱好者有了一个广泛学习、深入钻研的机会,特别是Linux内核的组织极为复杂,同时,又不能像windows平台的程序一样,可以使用集成...

    linux-source-2.6.39.4

    linux-source-2.6.39.4linux-2.6.39.4 kernel source code linux内核代码

    PyPI 官网下载 | mypy-boto3-sagemaker-1.10.39.4.tar.gz

    资源来自pypi官网。 资源全名:mypy-boto3-sagemaker-1.10.39.4.tar.gz

    PyPI 官网下载 | mypy-boto3-stepfunctions-1.10.39.4.tar.gz

    资源来自pypi官网。 资源全名:mypy-boto3-stepfunctions-1.10.39.4.tar.gz

    linux-2.6.39.4 kernel source code linux内核代码

    不知道为什么今天在网上下这个资源这么困难,所以传上来在这保存着,希望能对大家有用。

    Python库 | mypy-boto3-cloudsearch-1.10.39.4.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:mypy-boto3-cloudsearch-1.10.39.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python库 | mypy-boto3-appmesh-1.10.39.4.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:mypy-boto3-appmesh-1.10.39.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    faster_rcnnv1:fastRCNN的pytorch实现,736px(最大边),39.4mAP(COCO),30.21fps(RTX 2080TI)

    更快的RCNN ... 最后,这个 repo 在 736px(max thresh) 分辨率下使用 resnet50 主干实现了 39.4 mAp。(大约 30.21) Average Precision (AP) @[ IoU = 0.50:0.95 | area = all | maxDets = 100 ]

    TCP/IP技术大全(中文PDF非扫描版)

    10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 静态路由 96 11.1.2 距离-向量路由 99 11.1.3 链路-状态路由 100 11.2 IP网络中的收敛 102 11.2.1...

    TCP-IP技术大全

    10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 静态路由 96 11.1.2 距离-向量路由 99 11.1.3 链路-状态路由 100 11.2 IP网络中的收敛 102 11.2.1...

    Shell脚本专家指南

    尽管这些脚本是从一名系统管理员的角度进行编写的。但你几乎可以为任何你能想得到的目的而重用它们。《Shell脚本专家指南》中的所有代码或者是非常有用,或者是非常地独特(甚至可能会有一点与众不同)。不过其中...

    php网络开发完全手册

    17.2.1 开始使用Session 280 17.2.2 Session预定义数组 281 17.2.3 Session的检测与注销 281 17.2.4 PHP中Session处理的定制 282 17.3 Session应用实例——登录验证 286 17.3.1 数据库设计 286 17.3.2 HTML表单的...

    javalruleetcode-leetcodesolutions::check_mark_button:LeetCode问题的解决方案大部分是用Java解决的,100%的测试覆

    39.4 MB 04-06-2020 12 6 毫秒 38.3 MB 10-03-2021 13 5 毫秒 40.2 MB 23-05-2020 14 2 毫秒 39.4 MB 21-05-2020 15 2 毫秒 39.4 MB 21-05-2020 16 2 毫秒 39.4 MB 21-05-2020 17 1190 毫秒 48 MB 11-01-2020 18 15 ...

    TCP/IP教程TCP/IP基础

    10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 静态路由 96 11.1.2 距离-向量路由 99 11.1.3 链路-状态路由 100 11.2 IP网络中的收敛 102 11.2.1...

    TCP/IP技术大全

    10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 静态路由 96 11.1.2 距离-向量路由 99 11.1.3 链路-状态路由 100 11.2 IP网络中的收敛 102 11.2.1...

    TCP/IP详解

    10.4 从IPv4到IPv6的过渡 93 10.5 小结 94 第四部分 IP互联 第11章 IP网络中的路由 95 11.1 路由基本知识 95 11.1.1 静态路由 96 11.1.2 距离-向量路由 99 11.1.3 链路-状态路由 100 11.2 IP网络中的收敛 102 11.2.1...

    informix 实用大全

    本书由专业Informix用户、数据库管理员、Informix管理员和应用程序开发员编写而成,把各大Informix产品的方方面面综合、深入地集中在一起,包括最新Informix产品的详细信息,如Informix Internet Foundation.2000...

Global site tag (gtag.js) - Google Analytics