【Shiro】SpringBoot集成Shiro权限认证《上》

基础认识

Subject

主体,代表了当前的“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是主体,如第三方进程、网络爬虫、机器人等,Subject是一个抽象概念,所有的Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager,可以把Subject认为是一个门面;SecurityManager才是实际的执行者.

SecurityManager

安全管理器,即所有与安全有关的操作都会与SecurityManager进行交互,是Shiro框架的核心,
管理所有的Subject,类似于Spring MVC的前端控制器DispatcherServlet;

Realms

Shiro从Realm中获取安全数据(比如用户、角色、权限),SecurityManager要验证用户身份,
需要从Realm中获取相应的用户进行比较确定用户是否合法;验证用户角色/权限也需要从Realm获得相应数据进行比较,类似于DataSource,安全数据源;它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。

总之:

用户、权限是通过Realm让开发人员自己注入到SecurityManager,从而让SecurityManager能得到合法的用户以及权限进行判断;

开始

创建SpringBoot项目

依赖引入

<!--引入shrio-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-starter</artifactId>
        <version>1.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!--引入shrio-->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-starter</artifactId>
        <version>1.5.3</version>
    </dependency>

自定义Realm

public class CustomerRealm extends AuthorizingRealm {

    /**
     * 授权逻辑
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了=>授权逻辑PrincipalCollection");
        return null;
    }

    /**
     * 认证逻辑
     * @param authenticationToken
     * @return
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
        System.out.println("执行了=>认证逻辑AuthenticationToken");
        return null;
    }
}

Shiro配置

  • 创建 ShiroFilterFactoryBean
  • 创建 DefaultWebSecurityManager
  • 创建 realm 对象

基础结构

@Configuration
public class ShiroConfig {
    
    /**
     * realm对象
     * @return
     */
    @Bean
    public CustomerRealm myShiroRealm() {
        return null;
    }

    /**
     * 权限管理,配置主要是Realm的管理认证
     * @return
     */
    @Bean
    public DefaultWebSecurityManager securityManager() {
       return null;
    }

    /**
     * Filter工厂,设置对应的过滤条件和跳转条件
     * @param securityManager
     * @return
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        return null;
    }
}

创建Realm 对象

Realm对象

   /**
     * Realm对象
     * @return
     */
    @Bean
    public CustomerRealm myShiroRealm() {
        return new CustomerRealm();
    }

创建DefaultWebSecurityManager

权限管理,配置主要是Realm的管理认证

 /**
     * 权限管理,配置主要是Realm的管理认证
     * @return
     */
    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myShiroRealm());
        return securityManager;
    }

创建 ShiroFilterFactoryBean

Filter工厂,设置对应的过滤条件和跳转条件

   /**
     * Filter工厂,设置对应的过滤条件和跳转条件
     * @param securityManager
     * @return
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        return shiroFilterFactoryBean;
    }

登录接口

创建一个文件夹controller/LoginController.java

@RestController
public class LoginController {
    
    @GetMapping("/login")
    public String login(String userName,String passWord) {
        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(passWord)) {
            return "用户名密码不能为空";
        }
        //用户认证信息
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userName, passWord);
        try {
            subject.login(usernamePasswordToken);
        } catch (UnknownAccountException e) {
            return "用户不存在";
        } catch (AuthenticationException e) {
            return "用户名密码错误";
        } catch (AuthorizationException e) {
            return "无权限登录";
        }
        return "登录成功";
    }
}

修改过滤条件以及认证逻辑

过滤条件

修改ShiroConfig中的过滤工厂,设置所有的请求都需要认证,放行登录请求。

注意:

这里有一些shiro内置的过滤请求,如下所示:

  • anon:无需认证就可以访问
  • authc:必须认证才可以访问
  • user:必须有“记住我”功能才能使用
  • perms:拥有对某个资源的权限才能访问
  • role:拥有某个角色权限才能访问
/**
     * Filter工厂,设置对应的过滤条件和跳转条件
     *
     * @param securityManager
     * @return
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> map = new HashMap<>();
        //对所有用户认证
        map.put("/**", "authc");
        //登录
        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
    }

认证逻辑

shiro会自动帮我们去比对用户名和密码

在这里,定义了userName 和 passWord ,后续连接数据库后,这里应该是需要通过查询数据库。

 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
        System.out.println("执行了=>认证逻辑AuthenticationToken");
        String userName = "admin";
        String passWord = "123456";
        //这里验证authenticationToken和simpleAuthenticationInfo的信息
     
        return  new SimpleAuthenticationInfo(userName, passWord, getName());
    }

到这里,我们可以启动我们工程,访问登录接口,测试一番了。

访问地址:http://localhost:8080/login -> 用户名密码不能为空
访问地址:http://localhost:8080/login?userName=wang&passWord=111 -> 用户名密码错误
访问地址: http://localhost:8080/login?userName=admin&passWord=123456 -> 登录成功

到这里,暂时结束了。下一章,会连接数据库,完成登录及权限认证相关操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是基于Spring框架的快速开发应用程序的工具,而Shiro则是一个强大且灵活的Java安全框架。将Spring BootShiro结合使用可以实现权限管理的功能。 首先需要在Spring Boot项目中引入相关依赖,包括Spring Boot的依赖和Shiro的依赖。可以在pom.xml文件中添加如下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.1</version> </dependency> ``` 接下来,需要配置Shiro的配置类。可以创建一个继承自org.apache.shiro.web.mgt.DefaultWebSecurityManager的类,并在该类中配置Shiro的相关信息,包括认证器和授权器。 认证器负责验证用户的身份,可以使用Shiro提供的Realm来实现自定义的身份验证逻辑。授权器负责判断用户是否有权限执行某个操作,可以使用Shiro提供的Permission类来实现权限的控制。 然后,需要为Spring Boot应用程序配置Shiro过滤器链。可以使用Shiro的FilterChainDefinitionMap类来配置URL与权限的映射关系。可以在一个继承自org.apache.shiro.web.env.AbstractWebEnvironment的类中配置这些过滤器链。 最后,在Spring Boot应用程序的入口类中启动Shiro配置。在main()方法中,可以使用org.apache.shiro.SecurityUtils类的setSecurityManager()方法来设置Shiro的安全管理器。 完成以上步骤后,Spring Boot应用程序就集成Shiro权限管理功能。可以通过编写相应的Controller和页面来测试权限管理的效果。 总之,通过将Spring BootShiro结合使用,可以实现权限管理的功能。通过配置Shiro的相关类和过滤器链,以及编写自定义的Realm和Permission,可以实现身份验证和权限控制的逻辑。 ### 回答2: Spring Boot是一个用于创建独立的、基于Spring的应用程序的框架。Shiro是一个强大的Java安全框架,提供了身份认证、授权、加密等安全功能。下面是使用Spring Boot集成Shiro权限管理的步骤和注意事项。 1. 添加依赖:在Maven或Gradle中添加Spring BootShiro的依赖项。 2. 创建Shiro配置类:创建一个继承自`org.apache.shiro.spring.config.ShiroAnnotationProcessorConfiguration`的配置类。在该类中配置Shiro的安全相关属性,比如加密算法、身份认证方式等。 3. 创建用户实体类:创建表示用户的实体类,并为其添加相关属性,如用户名、密码等。 4. 创建用户服务类:创建一个用户服务类,用于处理用户相关的操作,如用户注册、查询用户等。 5. 创建Realm类:创建一个继承自`org.apache.shiro.realm.AuthorizingRealm`的自定义Realm类。在该类中,实现身份认证和授权的逻辑。 6. 配置Shiro过滤器:在`application.properties`文件中配置Shiro的过滤器链,指定URL与权限之间的对应关系。 7. 创建Controller类:创建一个Controller类,用于处理用户请求。在该类中,通过`@RequiresRoles`和`@RequiresPermissions`等注解为方法添加授权需求。 8. 启动应用程序:使用Spring Boot的注解启动应用程序,让Spring Boot自动配置并启用Shiro。 注意事项: - 在配置Shiro时,需要根据实际需要选择适当的安全策略、加密算法和认证方式。 - 在自定义Realm类中,需要根据实际需求进行身份认证和授权的实现。 - 在通过Shiro注解为方法添加授权需求时,需要确保用户已经成功登录。 - 需要根据实际业务需求,合理配置Shiro的过滤器链,以获得所需的权限控制效果。 总之,使用Spring Boot集成Shiro权限管理可以方便地实现应用程序的安全认证和授权功能。通过配置Shiro的相关属性和自定义Realm类,可以实现灵活的权限管理,保护应用程序的安全。 ### 回答3: Spring Boot集成Shiro权限管理是一种常用的方式,可以实现安全的身份验证和授权功能。以下是一个简单的步骤,来演示如何实现这个集成。 第一步,导入相关依赖。在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.7.1</version> </dependency> ``` 第二步,编写Shiro的配置文件。创建一个类,命名为ShiroConfig,并使用@Configuration注解将其声明为一个配置类。在配置类中,使用@RequiresPermissions注解来定义URL的访问权限,使用@Bean注解来创建ShiroFilterFactoryBean和DefaultWebSecurityManager等Bean。 第三步,创建一个自定义的Realm类。这个类需要继承自AuthenticatingRealm,并实现其中的认证和授权方法。在认证方法中,需要根据用户名和密码来进行验证用户的身份。在授权方法中,需要判断用户是否具有访问某个URL的权限。 第四步,在Spring Boot的启动类中,添加@EnableCaching注解来启用缓存功能。这样可以提高系统的性能。 第五步,编写Controller类。在Controller中,使用@RequiresPermissions注解来定义URL的访问权限。在方法中,可以使用Subject进行身份验证和授权操作。 最后,启动应用程序。通过访问配置的URL,可以验证是否成功实现了Shiro权限管理功能。 通过以上步骤,我们可以实现Spring Boot集成Shiro权限管理。这样就可以在应用程序中实现安全的身份验证和授权功能,确保只有具备相应权限的用户可以访问指定的URL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值