温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Springboot整合Shiro怎么实现登录与权限校验

发布时间:2022-04-28 10:23:27 来源:亿速云 阅读:218 作者:iii 栏目:开发技术

Springboot整合Shiro怎么实现登录与权限校验

目录

  1. 引言
  2. Shiro简介
  3. Spring Boot简介
  4. 项目搭建
  5. Shiro核心组件
  6. Shiro配置
  7. 用户认证
  8. 权限校验
  9. Shiro与Spring Boot整合
  10. 实现登录功能
  11. 实现权限校验
  12. 常见问题与解决方案
  13. 总结

引言

在现代Web应用中,用户认证和权限校验是必不可少的功能。Spring Boot快速开发框架,提供了丰富的功能来简化开发过程。而Shiro强大的安全框架,能够帮助我们轻松实现用户认证和权限校验。本文将详细介绍如何在Spring Boot项目中整合Shiro,并实现登录与权限校验功能。

Shiro简介

Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro的设计目标是简化应用程序的安全管理,使开发者能够专注于业务逻辑的实现。

Shiro的核心功能

  • 认证(Authentication):验证用户的身份。
  • 授权(Authorization):控制用户对资源的访问权限。
  • 会话管理(Session Management):管理用户的会话。
  • 加密(Cryptography):提供加密和解密功能。

Spring Boot简介

Spring Boot是Spring框架的一个子项目,旨在简化Spring应用的初始搭建和开发过程。Spring Boot通过自动配置和约定优于配置的原则,使得开发者能够快速构建独立的、生产级别的Spring应用。

Spring Boot的主要特点

  • 自动配置:根据项目的依赖自动配置Spring应用。
  • 独立运行:内置Tomcat、Jetty等服务器,无需部署WAR文件。
  • 生产就绪:提供健康检查、指标监控等生产环境所需的功能。

项目搭建

在开始整合Shiro之前,我们需要先搭建一个Spring Boot项目。可以使用Spring Initializr来快速生成项目骨架。

使用Spring Initializr创建项目

  1. 打开Spring Initializr
  2. 选择项目类型为Maven Project。
  3. 选择Spring Boot版本。
  4. 添加依赖:Spring Web、Spring Security、Thymeleaf等。
  5. 点击Generate按钮,下载生成的项目压缩包。
  6. 解压并导入到IDE中。

项目结构

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── demo
│   │               ├── config
│   │               ├── controller
│   │               ├── entity
│   │               ├── service
│   │               └── DemoApplication.java
│   └── resources
│       ├── static
│       ├── templates
│       └── application.properties
└── test
    └── java
        └── com
            └── example
                └── demo

Shiro核心组件

在整合Shiro之前,我们需要了解Shiro的核心组件及其作用。

Subject

Subject是Shiro的核心概念,代表当前用户的安全操作。通过Subject,我们可以执行认证、授权等操作。

SecurityManager

SecurityManager是Shiro的核心组件,负责管理所有Subject的安全操作。它是Shiro的入口点,所有的安全操作都需要通过SecurityManager来执行。

Realm

Realm是Shiro与应用程序安全数据之间的桥梁。它负责从数据源(如数据库、LDAP等)获取安全数据,并将其转换为Shiro可以理解的格式。

Shiro配置

在Spring Boot项目中,我们需要通过配置类来配置Shiro。

创建Shiro配置类

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        // 配置拦截器
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        // 配置登录页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 配置登录成功后的页面
        shiroFilterFactoryBean.setSuccessUrl("/index");
        // 配置未授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

        return shiroFilterFactoryBean;
    }

    @Bean
    public SecurityManager securityManager(Realm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }

    @Bean
    public Realm realm() {
        return new MyRealm();
    }
}

配置拦截器

在Shiro中,我们可以通过配置拦截器来控制资源的访问权限。常见的拦截器有: - anon:匿名访问,不需要认证。 - authc:需要认证才能访问。 - logout:退出登录。

配置登录页面和未授权页面

通过shiroFilterFactoryBean.setLoginUrl()shiroFilterFactoryBean.setUnauthorizedUrl()方法,我们可以配置登录页面和未授权页面。

用户认证

用户认证是验证用户身份的过程。在Shiro中,我们可以通过自定义Realm来实现用户认证。

自定义Realm

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 授权逻辑
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException("用户不存在");
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }
}

实现认证逻辑

doGetAuthenticationInfo方法中,我们可以通过AuthenticationToken获取用户输入的用户名和密码,然后与数据库中的用户信息进行比对。如果用户存在且密码正确,则返回一个SimpleAuthenticationInfo对象,否则抛出AuthenticationException异常。

权限校验

权限校验是控制用户对资源访问权限的过程。在Shiro中,我们可以通过自定义Realm来实现权限校验。

实现授权逻辑

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    String username = (String) principals.getPrimaryPrincipal();
    User user = userService.findByUsername(username);
    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    authorizationInfo.setRoles(userService.findRoles(username));
    authorizationInfo.setStringPermissions(userService.findPermissions(username));
    return authorizationInfo;
}

配置权限

doGetAuthorizationInfo方法中,我们可以通过PrincipalCollection获取当前用户的用户名,然后查询该用户的角色和权限,并将其设置到SimpleAuthorizationInfo对象中。

Shiro与Spring Boot整合

在Spring Boot项目中,我们可以通过配置类来整合Shiro。

配置Shiro

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        // 配置拦截器
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        // 配置登录页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 配置登录成功后的页面
        shiroFilterFactoryBean.setSuccessUrl("/index");
        // 配置未授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

        return shiroFilterFactoryBean;
    }

    @Bean
    public SecurityManager securityManager(Realm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }

    @Bean
    public Realm realm() {
        return new MyRealm();
    }
}

配置拦截器

在Shiro中,我们可以通过配置拦截器来控制资源的访问权限。常见的拦截器有: - anon:匿名访问,不需要认证。 - authc:需要认证才能访问。 - logout:退出登录。

配置登录页面和未授权页面

通过shiroFilterFactoryBean.setLoginUrl()shiroFilterFactoryBean.setUnauthorizedUrl()方法,我们可以配置登录页面和未授权页面。

实现登录功能

在Spring Boot项目中,我们可以通过Controller来实现登录功能。

创建登录Controller

@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/login")
    public String doLogin(@RequestParam String username, @RequestParam String password, Model model) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return "redirect:/index";
        } catch (AuthenticationException e) {
            model.addAttribute("error", "用户名或密码错误");
            return "login";
        }
    }
}

实现登录逻辑

doLogin方法中,我们可以通过SecurityUtils.getSubject()获取当前用户,然后创建一个UsernamePasswordToken对象,并调用subject.login()方法进行登录。如果登录成功,则跳转到首页;如果登录失败,则返回登录页面并显示错误信息。

实现权限校验

在Spring Boot项目中,我们可以通过注解来实现权限校验。

使用注解进行权限校验

@Controller
public class UserController {

    @RequiresRoles("admin")
    @GetMapping("/admin")
    public String admin() {
        return "admin";
    }

    @RequiresPermissions("user:view")
    @GetMapping("/user")
    public String user() {
        return "user";
    }
}

配置注解支持

在Shiro配置类中,我们需要启用注解支持。

@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
    advisor.setSecurityManager(securityManager);
    return advisor;
}

实现权限校验逻辑

通过@RequiresRoles@RequiresPermissions注解,我们可以控制用户对资源的访问权限。如果用户没有相应的角色或权限,则会被重定向到未授权页面。

常见问题与解决方案

在整合Shiro的过程中,可能会遇到一些常见问题。以下是一些常见问题及其解决方案。

问题1:Shiro无法拦截请求

解决方案:检查Shiro配置类中的拦截器配置,确保拦截器配置正确。

问题2:用户认证失败

解决方案:检查自定义Realm中的认证逻辑,确保用户名和密码正确。

问题3:权限校验失败

解决方案:检查自定义Realm中的授权逻辑,确保用户拥有相应的角色和权限。

问题4:注解无法生效

解决方案:检查Shiro配置类中的注解支持配置,确保注解支持已启用。

总结

通过本文的介绍,我们了解了如何在Spring Boot项目中整合Shiro,并实现登录与权限校验功能。Shiro强大的安全框架,能够帮助我们轻松实现用户认证和权限校验。希望本文能够帮助你在实际项目中更好地使用Shiro。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI