• 整合Shiro+Jwt


    整合Shiro+Jwt大体思路

    springboot整合shiro大体上的思路:

    1.自定义一个类Realm extends AuthorizingRealm{}

    主要是对token授权和认证

    重写2个方法

    doGetAuthorizationInfo  //授权
    doGetAuthenticationInfo  //认证
    认证 代码中手动加上对token校验的判断
    
    
    2.自定义一个@Configuration类ShiroConfig

    ShiroConfig类主要做3个事情

    将自定义的Realm注册bean

    将realm对象与securityManager对象关联  

    securityManager.setRealm(realm);

    将securityManager对象与ShiroFilterFactoryBean对象关联

    shiroFilterFactoryBean.setSecurityManager(getDefaultWebSecurityManager);

    3.整合jwt

    先定义公共类JwtUtils

    其中定义三个方法 作用分别为token生成  token校验  token是否过期

    在realm类的认证doGetAuthenticationInfo方法中调用JwtUtils解析token和登录用户是否满足条件

    满足则返回AuthenticationInfo对象 对象中包含profile token name

    (只需要定义个profile就好了  profile就是登录的用户信息  可以再定义一个用户实体类  把用户信息放入实体类中那这个对象类就是profile)

    边学边整理思路  详细的得边敲边看代码

    Shiro整合JWT的两种方式

    1.通过URL进行权限控制:
    • 配置方式: 在Shiro的配置文件(通常是shiro.ini或shiro-config.xml)中配置URL路径与权限的映射关系。这个配置指定了哪些URL需要哪些权限。
    1. <property name="filterChainDefinitions">
    2. /admin/** = roles[admin], perms["user:delete"]
    3. /user/** = authc
    4. property>

    代码示例: 在Java代码中,只需配置Shiro的FilterChainDefinitionMap,将URL路径和权限映射起来。

    1. Map filterChainDefinitionMap = new LinkedHashMap<>();
    2. filterChainDefinitionMap.put("/admin/**", "roles[admin]");
    3. filterChainDefinitionMap.put("/user/**", "authc");

    特点:

    • 静态配置:权限规则在配置文件中静态定义,不易动态改变。
    • 适用于简单的权限需求,不需要频繁修改权限规则。

    2.通过注解进行权限控制:
    • 配置方式: 在需要进行权限控制的Controller类或方法上使用Shiro提供的注解,如@RequiresRoles@RequiresPermissions
    1. @Controller
    2. @RequestMapping("/admin")
    3. public class AdminController {
    4. @RequiresRoles("admin")
    5. @GetMapping("/view")
    6. public String adminView() {
    7. // 处理业务逻辑
    8. return "admin/view";
    9. }
    10. }

    特点:

    • 动态控制:权限规则可以根据方法的注解动态变化,不需要重新配置。
    • 精细控制:可以根据方法级别的注解进行更精细的权限控制。
    3.配置文件和注解的关系:
    • 在项目中,通常会将基本的URL路径与权限的映射关系配置在配置文件中,这些是项目的基础权限。然后,通过注解在Controller中进行更精细的权限控制,例如,限制某个Controller的某个方法需要特定的角色或权限。
    1. <property name="filterChainDefinitions">
    2. /admin/** = roles[admin], perms["user:delete"]
    3. /user/** = authc
    4. property>
    1. @Controller
    2. @RequestMapping("/admin")
    3. public class AdminController {
    4. @RequiresRoles("admin")
    5. @GetMapping("/view")
    6. public String adminView() {
    7. // 处理业务逻辑
    8. return "admin/view";
    9. }
    10. }
    1. 这种组合方式可以实现项目中灵活的权限控制,基本权限由配置文件定义,而特殊权限由注解在代码中控制,使得权限管理更加清晰和可维护。

    通过这种组合方式,您可以在项目中实现动态和精细的权限管理,同时保持基本权限的静态配置,以适应不同的权限需求。

    对比说明

    1. 通过URL进行权限控制:

    首先,配置Shiro的过滤器和URL拦截规则,然后在控制器中添加注解。

    Shiro配置文件 (shiro.ini 或 shiro-config.xml):

    1. <bean id="jwtFilter" class="com.example.JWTFilter">bean>
    2. <filter-mappings>
    3. <filter-name>jwtFilterfilter-name>
    4. <url-pattern>/api/**url-pattern>
    5. filter-mappings>

    控制器 (AdminController.java):

    1. @Controller
    2. @RequestMapping("/admin")
    3. public class AdminController {
    4. // 需要admin:view权限才能访问
    5. @GetMapping("/view")
    6. public String view() {
    7. return "admin/view";
    8. }
    9. // 其他业务方法
    10. }
    2. 通过注解进行权限控制:

    在控制器方法上添加Shiro的注解来声明需要的角色或权限。

    控制器 (AdminController.java):

    1. @Controller
    2. @RequestMapping("/admin")
    3. public class AdminController {
    4. @RequiresPermissions("admin:view") // 使用注解声明需要admin:view权限
    5. @GetMapping("/view")
    6. public String view() {
    7. return "admin/view";
    8. }
    9. // 其他业务方法
    10. }

    上述代码演示了通过URL控制和通过注解控制权限的两种方式。通过URL控制更加基于URL模式,适用于相对简单的权限需求,可以在配置文件中进行集中管理。通过注解控制更加直观,能够明确指定每个方法的权限要求,适用于需要细粒度控制的情况。

    合二为一:

    Shiro配置文件 (shiro.ini 或 shiro-config.xml):
    1. <bean id="jwtFilter" class="com.example.JWTFilter">bean>
    2. <filter-mappings>
    3. <filter-name>jwtFilterfilter-name>
    4. <url-pattern>/api/**url-pattern>
    5. filter-mappings>
    控制器 (AdminController.java):(注意两种方式代码基本一致,只是注释有区别)
    1. @Controller
    2. @RequestMapping("/admin")
    3. public class AdminController {
    4. @RequiresPermissions("admin:view") // 使用注解声明需要admin:view权限
    5. @GetMapping("/view")
    6. public String view() {
    7. return "admin/view";
    8. }
    9. // 其他业务方法,例如编辑管理员信息,需要admin:edit权限
    10. @RequiresPermissions("admin:edit")
    11. @GetMapping("/edit")
    12. public String edit() {
    13. return "admin/edit";
    14. }
    15. // 删除管理员,需要admin:delete权限
    16. @RequiresPermissions("admin:delete")
    17. @GetMapping("/delete")
    18. public String delete() {
    19. return "admin/delete";
    20. }
    21. // 其他业务方法
    22. }

    在上述示例中,我们添加了更多的业务方法,如编辑管理员信息和删除管理员,并使用Shiro的@RequiresPermissions注解明确指定每个方法需要的权限要求。例如,edit方法需要admin:edit权限,delete方法需要admin:delete权限。

  • 相关阅读:
    【Java】若依前后端分离,分页数据为null报错
    vue2.7 火影版本,难道只是vue3的过度版?
    高德面试:为什么Map不能插入null?
    面试系列 - JVM内存模型和调优详解
    一文1800字从0到1使用Python Flask实战构建Web应用
    Qt5开发从入门到精通——第六篇三节( 图像与图片——双缓冲机制)
    WebGIS瓦片地图添加水印(矢量瓦片、栅格瓦片)
    2022 最新最全 Java 面试八股文(整整 1685 页,14 个技术栈,20 余万字)
    Redis的持久化详解
    Spring状态机(FSM),让订单状态流转如丝般顺滑
  • 原文地址:https://blog.csdn.net/qq_57747969/article/details/133017259