• 售前

  • 售后

热门帖子
入门百科

SpringBoot之----了解Shiro安全框架

[复制链接]
狂人阿飙湛 显示全部楼层 发表于 2022-1-12 12:10:49 |阅读模式 打印 上一主题 下一主题
1.Shiro简介

我们可以理解为跟SpringSecurity框架差不多的框架只不过更加的完美:
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。
Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。
记住一点,Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。


可以看到:应用代码直接交互的对象是 Subject,也就是说 Shiro 的对外 API 核心就是 Subject;其每个 API 的含义:
Subject:主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
Realm:域,Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。
也就是说对于我们而言,最简单的一个 Shiro 应用:
应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。
从以上也可以看出,Shiro 不提供维护用户 / 权限,而是通过 Realm 让开发人员自己注入。
2.快速开始

老规矩去官网查看,然后下载代码看能不能运行。
项目结构:


pom.xml

  1. <dependency>
  2.   <groupId>org.apache.shiro</groupId>
  3.   <artifactId>shiro-core</artifactId>
  4.   <version>1.4.1</version>
  5. </dependency>
  6. <dependency>
  7.   <groupId>org.slf4j</groupId>
  8.   <artifactId>slf4j-log4j12</artifactId>
  9.   <version>1.7.21</version>
  10. </dependency>
  11. <dependency>
  12.   <groupId>org.slf4j</groupId>
  13.   <artifactId>jcl-over-slf4j</artifactId>
  14.   <version>1.7.21</version>
  15. </dependency>
  16. <dependency>
  17.   <groupId>log4j</groupId>
  18.   <artifactId>log4j</artifactId>
  19.   <version>1.2.17</version>
  20. </dependency>
  21. <dependency>
  22.   <groupId>commons-logging</groupId>
  23.   <artifactId>commons-logging</artifactId>
  24.   <version>1.1.1</version>
  25. </dependency>
复制代码
log4j

  1. log4j.rootLogger=INFO, stdout
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
  5. # General Apache libraries
  6. log4j.logger.org.apache=WARN
  7. # Spring
  8. log4j.logger.org.springframework=WARN
  9. # Default Shiro logging
  10. log4j.logger.org.apache.shiro=INFO
  11. # Disable verbose logging
  12. log4j.logger.org.apache.shiro.util.ThreadContext=WARN
  13. log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN
复制代码
shiro.ini

  1. [users]
  2. # user 'root' with password 'secret' and the 'admin' role
  3. root = secret, admin
  4. # user 'guest' with the password 'guest' and the 'guest' role
  5. guest = guest, guest
  6. # user 'presidentskroob' with password '12345' ("That's the same combination on
  7. # my luggage!!!" ;)), and role 'president'
  8. presidentskroob = 12345, president
  9. # user 'darkhelmet' with password 'ludicrousspeed' and roles 'darklord' and 'schwartz'
  10. darkhelmet = ludicrousspeed, darklord, schwartz
  11. # user 'lonestarr' with password 'vespa' and roles 'goodguy' and 'schwartz'
  12. lonestarr = vespa, goodguy, schwartz
  13. [roles]
  14. # 'admin' role has all permissions, indicated by the wildcard '*'
  15. admin = *
  16. # The 'schwartz' role can do anything (*) with any lightsaber:
  17. schwartz = lightsaber:*
  18. # The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with
  19. # license plate 'eagle5' (instance specific id)
  20. goodguy = winnebago:drive:eagle5
复制代码
Quickstart.java

  1. import org.apache.shiro.SecurityUtils;
  2. import org.apache.shiro.authc.*;
  3. import org.apache.shiro.config.IniSecurityManagerFactory;
  4. import org.apache.shiro.mgt.SecurityManager;
  5. import org.apache.shiro.session.Session;
  6. import org.apache.shiro.subject.Subject;
  7. import org.apache.shiro.util.Factory;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. /**
  11. * @author lee
  12. * @date 2020/8/11 - 6:24 下午
  13. */
  14. public class Quickstart {
  15.   private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class);
  16.   public static void main(String[] args) {
  17.     Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
  18.     SecurityManager securityManager = factory.getInstance();
  19.     SecurityUtils.setSecurityManager(securityManager);
  20.     //获取当前的用户对象 Subject
  21.     Subject currentUser = SecurityUtils.getSubject();
  22.     // 通过当前用户拿到Session
  23.     Session session = currentUser.getSession();
  24.     session.setAttribute("someKey", "aValue");
  25.     String value = (String) session.getAttribute("someKey");
  26.     if (value.equals("aValue")) {
  27.       log.info("Subject=>session[" + value + "]");
  28.     }
  29.     //判断当前用户是否被认证
  30.     if (!currentUser.isAuthenticated()) {
  31.       //Token: 令牌
  32.       UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
  33.       token.setRememberMe(true);//设置记住我
  34.       try {
  35.         currentUser.login(token);//执行登陆操作
  36.       } catch (UnknownAccountException uae) {
  37.         log.info("There is no user with username of " + token.getPrincipal());
  38.       } catch (IncorrectCredentialsException ice) {
  39.         log.info("Password for account " + token.getPrincipal() + " was incorrect!");
  40.       } catch (LockedAccountException lae) {
  41.         log.info("The account for username " + token.getPrincipal() + " is locked.  " +
  42.                  "Please contact your administrator to unlock it.");
  43.       }
  44.       // ... catch more exceptions here (maybe custom ones specific to your application?
  45.       catch (AuthenticationException ae) {
  46.         //unexpected condition?  error?
  47.       }
  48.     }
  49.     //say who they are:
  50.     //print their identifying principal (in this case, a username):
  51.     log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
  52.     //test a role:
  53.     if (currentUser.hasRole("schwartz")) {
  54.       log.info("May the Schwartz be with you!");
  55.     } else {
  56.       log.info("Hello, mere mortal.");
  57.     }
  58.     //test a typed permission (not instance-level)
  59.     if (currentUser.isPermitted("lightsaber:wield")) {
  60.       log.info("You may use a lightsaber ring.  Use it wisely.");
  61.     } else {
  62.       log.info("Sorry, lightsaber rings are for schwartz masters only.");
  63.     }
  64.     //a (very powerful) Instance Level permission:
  65.     if (currentUser.isPermitted("winnebago:drive:eagle5")) {
  66.       log.info("You are permitted to 'drive' the winnebago with license plate (id) 'eagle5'.  " +
  67.                "Here are the keys - have fun!");
  68.     } else {
  69.       log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
  70.     }
  71.     //all done - log out!
  72.     currentUser.logout();
  73.     System.exit(0);
  74.   }
  75. }
复制代码
主要的方法就是这些

SpringSecurity框架也都是有的:
  1. Subject currentUser = SecurityUtils.getSubject();
  2. Session session = currentUser.getSession();
  3. currentUser.isAuthenticated()
  4. currentUser.getPrincipal()
  5. currentUser.hasRole("schwartz")
  6. currentUser.isPermitted("lightsaber:wield")
  7. currentUser.logout();
复制代码
3.运行结果



来源:https://blog.caogenba.net/aaa123_456aaa/article/details/122411808
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作