• Shiro学习1----spring boot整合(Java方式)


    1.Shiro核心功能

    1. Authenticator    认证,验证用户是否有相应的身份--登录验证
    2. Authorizer      授权,即权限验证;对已经通过认证的用户检查是否有某个权限或者角色,从而控制是否能够进行某种操作
    3. Session  Managment  会话管理,用户认证成功之后创建会话,在没有退出之前,当前用户的所有信息都会保存再这个会话中,可以是普通的javaSE应用,也可以是web应用
    4. Cryptography  加密,对敏感信息进行加密处理,shiro就提供这种加密机制

            支持的特性:

    1. Web Support--Shiro提供了过滤器,可以通过过滤器拦截web请求来处理web应用的访问控制
    2. Caching 缓存支持,shiro可以缓存用户信息以及用户的角色权限信息,可以提高执行效率
    3. Concurrency shiro 支持多线程应用
    4. Testing 提供测试支持
    5. Run As 允许一个用户以另一种身份去访问
    6. Remeber Me

    2.Shiro三大核心组件:Subject丶Security Manager丶Realms

    • Subject:表示待认证和授权的用户
    • Security Manager:它是Shiro框架的核心,Shiro就是通过Security Manager来进行内部实例的管理,并通过它来提供安全管理的各种服务
      Authenticator:认证器
      Authorizer:授权器
      SessionManager:会话管理器
      CacheManager:缓存管理器
    • Realm:相当于Shiro进行认证和授权的数据源,充当了Shiro与安全数据之间的“桥梁”或者“连接器”。也就是说,当对用户进行认证(登录)和授权(访问控制)验证时,Shiro会应用配置的Realm中查找用户及权限信息。

     3.SpringBoot应用整合Shiro

    1.创建spring boot项目,导入依赖

    1. com.alibaba
    2. druid-spring-boot-starter
    3. 1.1.13
    4. mysql
    5. mysql-connector-java
    6. 8.0.29
    7. org.mybatis.spring.boot
    8. mybatis-spring-boot-starter
    9. 2.2.2
    10. org.springframework.boot
    11. spring-boot-starter-thymeleaf
    12. org.springframework.boot
    13. spring-boot-starter-web
    14. org.projectlombok
    15. lombok
    16. true

    2.创建配置文件application.yml

    1. spring:
    2. datasource:
    3. druid:
    4. url: jdbc:mysql://localhost:3306/db_shiro
    5. driver-class-name: com.mysql.cj.jdbc.Driver
    6. username: root
    7. password: root
    8. initial-size: 1
    9. min-idle: 1
    10. max-active: 20
    11. mybatis:
    12. mapper-locations: classpath:mappers/*Mapper.xml
    13. type-aliases-package: com.qfedu.shiro2.beans

    3.shiro整合

    1. 导入shiro依赖
      1. org.apache.shiro
      2. shiro-spring
      3. 1.4.0
    2. 配置shiro过滤器,拦截需要进行认证和授权的用户请求
    3. 配置SecurityManager到Spring容器
    4. 配置Realm(SecurityManager需要Realm)
    5. Realm从哪来----可以是Shiro提供的也可以是自定义的
      1. package com.qfedu.shiro2.config;
      2. import org.apache.shiro.realm.text.IniRealm;
      3. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
      4. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
      5. import org.springframework.context.annotation.Bean;
      6. import org.springframework.context.annotation.Configuration;
      7. import java.util.HashMap;
      8. import java.util.Map;
      9. @Configuration
      10. public class ShiroConfig {
      11. @Bean
      12. public IniRealm getIniReam(){
      13. IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
      14. return iniRealm;
      15. }
      16. @Bean
      17. public DefaultWebSecurityManager getDefaultWebSecurityManager(IniRealm iniRealm){
      18. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
      19. securityManager.setRealm(iniRealm);
      20. return securityManager;
      21. }
      22. @Bean
      23. public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager){
      24. ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
      25. //过滤器就是shiro进行权限校验的核心,进行认证和授权是需要SecurityManager的
      26. filter.setSecurityManager(securityManager);
      27. /*设置shiro的拦截规则
      28. anon 匿名用户可访问
      29. authc 认证用户可访问
      30. user 使用RemeberMe的用户可访问
      31. perms 对应权限可访问
      32. role 对应角色可访问
      33. */
      34. Map filterMap=new HashMap<>();
      35. filterMap.put("/", "anon");
      36. filterMap.put("/login.html", "anon");
      37. filterMap.put("/regist.html", "anon");
      38. filterMap.put("/user/login", "anon");
      39. filterMap.put("user/regist", "anon");
      40. filterMap.put("/static/**", "anon");
      41. filterMap.put("/**", "authc");
      42. filter.setFilterChainDefinitionMap(filterMap);
      43. filter.setLoginUrl("/login.html");
      44. //设置未授权访问的页面路径
      45. filter.setUnauthorizedUrl("/login.html");
      46. return filter;
      47. }
      48. }

      shiro.ini

      1. [users]
      2. zhangsan=123456,seller
      3. lisi=666666,ckmgr
      4. admin=222222,admin
      5. [roles]
      6. admin=*
      7. seller=order-add,order-del,order-list
      8. ckmgr=ck-add,ck-del,ck-list

    4.认证测试

    UserController

    1. package com.qfedu.shiro2.controller;
    2. import com.qfedu.shiro2.service.UserServiceImpl;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import javax.annotation.Resource;
    6. @Controller
    7. @RequestMapping("/user")
    8. public class UserController {
    9. @Resource
    10. private UserServiceImpl userService;
    11. @RequestMapping("/login")
    12. public String login(String userName,String userPwd){
    13. try {
    14. userService.checkLogin(userName, userPwd);
    15. System.out.println("登录成功");
    16. return "index";
    17. } catch (Exception e) {
    18. System.out.println("登录失败");
    19. return "login";
    20. }
    21. }
    22. }

    PageController

    1. package com.qfedu.shiro2.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. @Controller
    5. public class PageController {
    6. @RequestMapping("/login.html")
    7. public String login(){
    8. return "login";
    9. }
    10. @RequestMapping("/")
    11. public String login1(){
    12. return "login";
    13. }
    14. @RequestMapping("/index.html")
    15. public String index(){
    16. return "index";
    17. }
    18. }

    UserServiceImpl

    1. package com.qfedu.shiro2.service;
    2. import org.apache.shiro.SecurityUtils;
    3. import org.apache.shiro.authc.UsernamePasswordToken;
    4. import org.apache.shiro.subject.Subject;
    5. import org.springframework.stereotype.Service;
    6. @Service
    7. public class UserServiceImpl {
    8. public void checkLogin(String userName,String userPwd) throws Exception{
    9. Subject subject = SecurityUtils.getSubject();
    10. UsernamePasswordToken token = new UsernamePasswordToken(userName, userPwd);
    11. subject.login(token);
    12. }
    13. }

    login.html

    1. "en">
    2. "UTF-8">
    3. Title
    4. login

    5. "/user/login" method="post">
    6. 账号:"text" name="userName"/>

    7. 密码:"text" name="userPwd"/>

    8. "submit" value="登录"/>

  • 相关阅读:
    ChatGLM学习
    FFmpeg源码分析:AVFilterGraph与AVFilter
    UniApp video 使用(自定义进度条,及微信无法暂停播放设置进度问题)
    WebRTC学习笔记七 pion/webrtc
    【Redis在Windows中与Linux中的下载安装,启动服务和设置密码远程连接】
    打印机选择问题咨询 -11111
    软件设计原则 1小时系列 (C++版)
    if-else的改进方案
    【API篇】八、Flink窗口函数
    软通动力赋能触觉智能打造嵌入式鸿蒙原生系统应用标杆
  • 原文地址:https://blog.csdn.net/m0_61107050/article/details/126784344