• SpringBoot整合Shiro(仅测试认证)


    目录

    一.

    1.概述

    2.三个核心组件:

    二.整合 (连接后台数据库之后)

    1.导入shiro依赖

    2.创建Realm(名字任意)类 并extends AuthorizingRealm

    3.交给spring管理其对象

    4.控制器方法


    一.

    1.概述

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

    2.三个核心组件:

    Subject, SecurityManager 和 Realms

    Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)。

    SecurityManager则管理所有用户的安全操作

    Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。

    二.整合 (连接后台数据库之后)

    思路:shiro可以在登录的时候拦截请求,并让它返回指定页面,让它拦截未登录不能访问/user/update请求,并让其返回登录页面,所以要在控制器方法里获取用户输入的用户名和密码,shiro可以根据用户名和密码分别进行判断,在UserRealm里面根据获取的用户名查询数据库里的记录,可能有多个用户名相同的,所以返回的是集合,然后确定完用户名正确之后,根据获取的记录获得其用户名的所有密码,遍历进行判断。

    1.导入shiro依赖

    1. <dependency>
    2. <groupId>org.apache.shirogroupId>
    3. <artifactId>shiro-springartifactId>
    4. <version>1.4.0version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.shirogroupId>
    8. <artifactId>shiro-coreartifactId>
    9. <version>1.4.0version>
    10. dependency>

    2.创建Realm(名字任意)类 并extends AuthorizingRealm

    1. public class UserRealm extends AuthorizingRealm {
    2. @Autowired
    3. UserService userService;
    4. @Override
    5. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    6. System.out.println("执行了授权doGetAuthorizationInfo");
    7. return null;
    8. }
    9. @Override
    10. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    11. System.out.println("执行了认证doGetAuthorizationInfo");
    12. UsernamePasswordToken userToken = (UsernamePasswordToken) token;
    13. // 根据名字查用户 并查出其pwd
    14. List users = userService.findUsersByName(userToken.getUsername());
    15. if (users.isEmpty()) {
    16. //抛出异常:用户名不存在
    17. return null;
    18. }
    19. // 数组集合直接放都出错 ,根据姓名查出的用户又不只是一个
    20. // 密码认证shiro自己去做,防止密码泄露,经过了加密的;
    21. // SimpleAuthenticationInfo(Object principal, Object credentials, String realmName)
    22. int i = 0;
    23. String[] pwd = new String[users.size()];
    24. for (User u : users
    25. ) {
    26. pwd[i] = u.getPwd();
    27. if (new String(userToken.getPassword()).equals(pwd[i])) {
    28. return new SimpleAuthenticationInfo("", pwd[i].toCharArray(), "");
    29. }
    30. }
    31. return new SimpleAuthenticationInfo("", pwd[0], "");
    32. }
    33. }

    3.交给spring管理其对象

    1. @Configuration
    2. public class MyShiroConfig {
    3. @Bean(name="userRealm")
    4. public UserRealm userRealm(){
    5. // realm(领域)连接数据
    6. return new UserRealm();
    7. }
    8. @Bean(name="securityManager")
    9. public DefaultWebSecurityManager geDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
    10. //绑定userRealm()
    11. DefaultWebSecurityManager securityManager= new DefaultWebSecurityManager();
    12. //关联 UserRealm
    13. securityManager.setRealm(userRealm);
    14. return securityManager;
    15. }
    16. @Bean
    17. public ShiroFilterFactoryBean getShiroFileFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
    18. ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
    19. //设置安全管理器
    20. bean.setSecurityManager(defaultWebSecurityManager);
    21. //添加shiro的内置过滤器
    22. /*
    23. * anon:无需认证就可以访问
    24. * authc;必须认证才能访问
    25. * perms:拥有对某个资源的权限
    26. * */
    27. //拦截 必须是链式
    28. Map map=new LinkedHashMap();
    29. // map.put("/user/add","anon");//所有人都可以访问
    30. // map.put("/user/update","authc");//只有认证才可以访问
    31. //授权,正常情况下,没有授权会跳转到未授权页面
    32. // map.put("/user/add","perms[add]");//虽然认证了但是没有权限,
    33. // role 拥有某个角色的权限才能访问
    34. // user:add不能进入。要进入无权限页面,除非授权
    35. // map.put("/user/update","perms[update]");
    36. map.put("/user/update","authc");
    37. bean.setFilterChainDefinitionMap(map);
    38. bean.setLoginUrl("/user/toLogin");//没有权限回到login
    39. //未授权的页面
    40. // bean.setUnauthorizedUrl("/user/noauth");
    41. return bean;
    42. }

    4.控制器方法

    1. @RequestMapping("/login")
    2. public String login(String username, String pwd, ModelMap map){
    3. //获取当前用户
    4. Subject su= SecurityUtils.getSubject();
    5. //封装用户的登录数据
    6. UsernamePasswordToken token=new UsernamePasswordToken(username,pwd);
    7. //执行登录的方法
    8. try{
    9. su.login(token);
    10. return "/update";
    11. }catch(UnknownAccountException e){
    12. map.put("msg","用户名错误");
    13. return "login";
    14. }catch(IncorrectCredentialsException e){
    15. map.put("msg","密码错误");
    16. return "login";
    17. } //未授权的页面
    18. // bean.setUnauthorizedUrl("/user/noauth");
    19. // return bean;
    20. }
    21. @RequestMapping("/toLogin")
    22. public String toLogin(){
    23. return "login";
    24. }

  • 相关阅读:
    Java项目:基于SSM框架实现的汽车养护保养管理系统【ssm+B/S架构+源码+数据库+开题+毕业论文+任务书】
    面经-虚拟机-JVM内存参数
    Flink
    【动手学深度学习PyTorch版】18 使用块的网络 VGG
    机械寿命预测(基于NASA C-MAPSS数据的剩余使用寿命RUL预测,Python代码,CNN_LSTM模型,有详细中文注释)
    c# Dictionary vs SortedDictionary
    [MRCTF2020]套娃 GET POST 读取字符串特性 伪造ip 伪协议伪造 file_get_contents()
    浅谈敏捷开发
    12、设计模式之代理模式(Proxy)
    Apple - Core Image
  • 原文地址:https://blog.csdn.net/qq_46058550/article/details/126292081