前言:

  网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助。 有些朋友比较省事, 直接转发或者复制粘贴。但是没有经过自己键盘敲打过的代码, 不是自己的代码。所以, 我这里就来记录一个简洁版的。 不牵涉db的。 废话不多说, 开始。

一. jar包引入

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5.  
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-devtools</artifactId>
  9. <scope>runtime</scope>
  10. </dependency>
  11.  
  12. <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-autoconfigure -->
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-autoconfigure</artifactId>
  16. </dependency>
  17.  
  18. <dependency>
  19. <groupId>org.apache.shiro</groupId>
  20. <artifactId>shiro-spring</artifactId>
  21. <version>1.4.0</version>
  22. </dependency>
  23.  
  24. <dependency>
  25. <groupId>org.apache.shiro</groupId>
  26. <artifactId>shiro-ehcache</artifactId>
  27. <version>1.4.0</version>
  28. <exclusions>
  29. <exclusion>
  30. <groupId>org.apache.shiro</groupId>
  31. <artifactId>shiro-core</artifactId>
  32. </exclusion>
  33. </exclusions>
  34. </dependency>
  35.  
  36. <!-- 由于前面的包里面不包含这个,所以要单独引入, 如果不引入, shiro的权限注解不起作用 -->
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-aspects</artifactId>
  40. <version>5.0.7.RELEASE</version>
  41. </dependency>

二. MyShiroRealm

  1. public class MyShiroRealm extends AuthorizingRealm {
  2. //角色权限和对应权限添加
  3. @Override
  4. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  5. //获取登录用户名
  6. String name = (String) principalCollection.getPrimaryPrincipal();
  7. //添加角色和权限
  8. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
  9.  
  10. //添加角色
  11. simpleAuthorizationInfo.addRole("admin");
  12.  
  13. //添加权限
  14. simpleAuthorizationInfo.addStringPermission("create");
  15.  
  16. return simpleAuthorizationInfo;
  17. }
  18.  
  19. //用户认证
  20. @Override
  21. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken atoken) throws AuthenticationException {
  22.  
  23. UsernamePasswordToken token = (UsernamePasswordToken) atoken;
  24.  
  25. String name = token.getUsername();
  26.  
  27. if (name == null) {
  28. return null;
  29. }//这里验证authenticationToken和simpleAuthenticationInfo的信息
  30. SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(name, "123456", getName());
  31. return simpleAuthenticationInfo;
  32.  
  33. }
  34. }

这里由于没有连接数据库, 所以一些动态的地方, 直接写死。

三. 配置文件

  1. @Configuration
  2. public class ShiroConfiguration {
  3. //将自己的验证方式加入容器
  4. @Bean
  5. public MyShiroRealm myShiroRealm() {
  6. MyShiroRealm myShiroRealm = new MyShiroRealm();
  7. return myShiroRealm;
  8. }
  9.  
  10. //权限管理,配置主要是Realm的管理认证
  11. @Bean
  12. public org.apache.shiro.mgt.SecurityManager securityManager(CacheManager cacheManager, SessionManager sessionManager) {
  13. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  14. securityManager.setSessionManager(sessionManager);
  15. securityManager.setRealm(myShiroRealm());
  16. securityManager.setCacheManager(cacheManager);
  17. return securityManager;
  18. }
  19.  
  20. //Filter工厂,设置对应的过滤条件和跳转条件
  21. @Bean
  22. public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
  23. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  24. shiroFilterFactoryBean.setSecurityManager(securityManager);
  25. Map<String,String> map = new HashMap<String, String>();
  26. //登出
  27. map.put("/logout","logout");
  28. map.put("/doLogin", "anon");//对所有用户认证
  29. map.put("/**","authc");
  30. //登录
  31. shiroFilterFactoryBean.setLoginUrl("/login");
  32. //首页
  33. shiroFilterFactoryBean.setSuccessUrl("/index");
  34. //错误页面,认证不通过跳转
  35. shiroFilterFactoryBean.setUnauthorizedUrl("/error");
  36. shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
  37. return shiroFilterFactoryBean;
  38. }
  39.  
  40. //加入注解的使用,不加入这个注解不生效
  41. @Bean
  42. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
  43. AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
  44. advisor.setSecurityManager(securityManager);
  45. return advisor;
  46. }
  47.  
  48. @Bean
  49. public CacheManager cacheManager(){
  50. return new EhCacheManager();
  51. }
  52.  
  53. @Bean
  54. public SessionDAO sessionDAO(){
  55. return new EnterpriseCacheSessionDAO();
  56. }
  57.  
  58. @Bean
  59. public SessionManager sessionManager(SessionDAO sessionDAO){
  60. DefaultWebSessionManager manager = new DefaultWebSessionManager();
  61. manager.setSessionDAO(sessionDAO);
  62. manager.setGlobalSessionTimeout(3600000);
  63. manager.setSessionValidationInterval(3600000);
  64. return manager;
  65. }
  66. }

四. 控制器

  1. @RestController
  2. public class LoginController {
  3.  
  4. @GetMapping("/login")
  5. public String login(){
  6. return "need login";
  7. }
  8.  
  9. /登录
  10. @GetMapping("/doLogin")
  11. public String doLogin(String uid, String pwd){
  12. //添加用户认证信息
  13. Subject subject = SecurityUtils.getSubject();
  14. UsernamePasswordToken token = new UsernamePasswordToken(uid,pwd);
  15. try{
  16. //进行验证,这里可以捕获异常,然后返回对应信息
  17. subject.login(token);
  18. }
  19. catch(Exception e){
  20. return "login failed";
  21. }
  22.  
  23. return "login success";
  24. }
  25.  
  26. @RequestMapping(value = "/index")
  27. public String index(){
  28. return "index";
  29. }
  30.  
  31. //登出
  32. @RequestMapping(value = "/logout")
  33. public String logout(){
  34. return "logout";
  35. }
  36.  
  37. //错误页面展示
  38. @GetMapping("/error")
  39. public String error(){
  40. return "error ok!";
  41. }
  42.  
  43. @RequiresRoles("admin")
  44. @RequiresPermissions("create")
  45. @RequestMapping(value = "/create")
  46. public String create(){
  47. return "Create success!";
  48. }
  49.  
  50. @RequiresPermissions("detail")
  51. @RequestMapping(value = "/detail")
  52. public String detail(){
  53. return "uid";
  54. }
  55. }

到这里, 代码就敲完了。

application.yml里面, 只要两行代码:

server:

  port: 8080

五. 结果检验

  1. 1. 访问页面: http://localhost:8080/doLogin?uid=abc&pwd=123456

2. 访问: http://localhost:8080/create

3. 访问: http://localhost:8080/detail

  1.  

springboot 与 shiro 整合 (简洁版)的更多相关文章

  1. SpringBoot与Shiro整合权限管理实战

    SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...

  2. SpringBoot与Shiro整合

    一.数据库设计 ​ 这里主要涉及到五张表:用户表,角色表(用户所拥有的角色),权限表(角色所涉及到的权限),用户-角色表(用户和角色是多对多的),角色-权限表(角色和权限是多对多的).表结构建立的sq ...

  3. springboot,vue,shiro整合 关于登录认证功能

    首先是session问题 传统session认证 http协议是一种无状态协议,即浏览器发送请求到服务器,服务器是不知道这个请求是哪个用户发来的.为了让服务器知道请求是哪个用户发来的,需要让用户提供用 ...

  4. SpringBoot:Shiro 整合 Redis

    前言 前段时间做了一个图床的小项目,安全框架使用的是Shiro.为了使用户7x24小时访问,决定把项目由单机升级为集群部署架构.但是安全框架shiro只有单机存储的SessionDao,尽管Shrio ...

  5. 在 springboot 中如何整合 shiro 应用 ?

     Shiro是Apache下的一个开源项目,我们称之为Apache Shiro. 它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理,与spring Security 一样都是 ...

  6. SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)

    SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...

  7. Shiro整合springboot,freemaker,redis(含权限系统完整源码)

    区块链技术联盟 2018-02-08 17:06:40 目录 一.导语 二.shiro功能介绍 三.shiro详解 四.shiro实战案例分享 五.系统配置 六.其他 一.导语 今天推荐给大家一个非常 ...

  8. 教你 Shiro 整合 SpringBoot,避开各种坑

    教你 Shiro 整合 SpringBoot,避开各种坑-----https://www.cnblogs.com/HowieYuan/p/9259638.html

  9. Springboot + shiro 整合之Url拦截设置(转)

    shiro 整合到springboot 还是比较简单的,只需要新建一个spring-shiro.xml的配置文件: <span style="font-size:14px;" ...

随机推荐

  1. ubuntu18.04时区设置

    1.运行命令 sudo tzselect 2.选择大区 选择亚洲Asia,继续选择中国China,最后选择北京Beijing 3.建立软链 ln -sf /usr/share/zoneinfo/Asi ...

  2. 深入理解java虚拟机(一)-----java内存区域以及内存溢出异常

    概述 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,J ...

  3. JavaScript基础视频教程总结(071-080章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. Python之xml学习笔记

    XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...

  5. ORACLE知识点总结

    一.ORACEL常用命令 1.解锁账户:ALTER USER username ACCOUNT UNLOCK; 2.查看数据库字符集:SELECT USERENV ('language') FROM ...

  6. .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能

    首先,写一个简单的可被调用的服务注册到服务中心,我们这命名为java-service,用的是IDEA创建一个spring boot项目,选择spring client类型. 修改application ...

  7. 包建强的培训课程(16):Android新技术入门和提高

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...

  8. Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引

    Senparc.WeixinSDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大 ...

  9. 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅

    本文由微信开发团队工程是由“oneliang”原创发表于WeMobileDev公众号,内容稍有改动. 1.引言   Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发( ...

  10. Javascript高级编程学习笔记(44)—— 动态样式

    动态样式 动态样式和昨天的动态脚本一样,都是一种动态引入外部样式(脚本的方式) 由于样式是由 link 元素引入的,所以动态样式自然也就是动态生成link元素插入文档的方式 不过和动态脚本不同的是,动 ...