SpringBoot安全管理之Shiro框架怎么使用

2025-09-07

Shiro 简介

apache shiro 是一个开源的轻量级的 java 安全框架,它提供身份验证、授权、密码管理以及会话管理等功能。相对于 spring security ,shiro 框架更加直观、易用,同时也能提供健壮的安全性。

在传统的 SSM 框架中,手动整合 Shiro 的配置步骤还是比较多的,针对 Spring Boot ,Shiro 官方提供了 shiro-spring-boot-web-starter 用来简化 Shiro 在 Spring Boot 中的配置。

整合 Shiro

1. 创建项目

首先创建一个普通的 Spring Boot Web 项目,添加 Shiro 依赖以及页面模板依赖

  org.apache.shiro  shiro-spring-boot-web-starter  1.4.0  org.springframework.boot  spring-boot-starter-thymeleaf  com.github.theborakompanioni  thymeleaf-extras-shiro  2.0.0

这里不需要添加 spring-boot-starter-web 依赖,shiro-spring-boot-web-starter 中已经依赖了 spring-boot-starter-web 。同时,此处使用 Thymeleaf 模板,为了在 Thymeleaf 使用 shiro 标签,加入了 thymeleaf-extras-shiro 依赖。

2. Shiro基本配置

在 application.properties 中配置 Shiro 的基本信息

然后在 Java 代码中配置 Shiro ,提供两个最基本的 Bean 即可

@Configurationpublic class ShiroConfig {    @Bean    public Realm realm() {        TextConfigurationRealm realm = new TextConfigurationRealm();        realm.setUserDefinitions("sang=123,user\n admin=123,admin");        realm.setRoleDefinitions("admin=read,write\n user=read");        return realm;    }    @Bean    public ShiroFilterChainDefinition shiroFilterChainDefinition() {        DefaultShiroFilterChainDefinition chainDefinition =                new DefaultShiroFilterChainDefinition();        chainDefinition.addPathDefinition("/login", "anon");        chainDefinition.addPathDefinition("/doLogin", "anon");        chainDefinition.addPathDefinition("/logout", "logout");        chainDefinition.addPathDefinition("/**", "authc");        return chainDefinition;    }    @Bean    public ShiroDialect shiroDialect() {        return new ShiroDialect();    }}

代码解释:

  • 这里提供两个关键的 Bean ,一个是 Realm,另一个是 ShiroFilterChainDefinition 。至于 ShiroDialect 则是为了支持在 Thymeleaf 中使用 Shiro 标签,如果不在 Thymeleaf 中使用 Shiro 标签,那么可以不提供 ShiroDialect

  • Realm 可以是自定义的 Realm,也可以是 Shiro 提供的 Realm,简单起见,此处没有配置数据库连接,直接配置了两个用户:sang/123 和 admin/123 ,分别对应角色 user 和 admin。

  • ShiroFilterChainDefinition Bean 中配置了基本的过滤规则 ,“/login” 和 “/doLogin”,可以匿名访问,“/logout”是一个注销登录请求,其余请求则都需要认证后才能访问

然后配置登录接口以及页面访问接口

@Controllerpublic class UserController {    @PostMapping("/doLogin")    public String doLogin(String username, String password, Model model) {        UsernamePasswordToken token = new UsernamePasswordToken(username, password);        Subject subject = SecurityUtils.getSubject();        try {            subject.login(token);        } catch (AuthenticationException e) {            model.addAttribute("error", "用户名或密码输入错误!");            return "login";        }        return "redirect:/index";    }    @RequiresRoles("admin")    @GetMapping("/admin")    public String admin() {        return "admin";    }    @RequiresRoles(value = {"admin", "user"}, logical = Logical.OR)    @GetMapping("/user")    public String user() {        return "user";    }}

代码解释:

  • 在 doLogin 方法中,首先构建一个 UsernamePasswordToken 实例,然后获取一个 Subject 对象并调用该对象中的 login 方法执行登录操作,在登录操作执行过程中,当有异常抛出时,说明登录失败,携带错误信息返回登录视图;当登录成功时,则重定向到“/index”

  • 接下来暴露两个接口“/admin”和“/user”,对于“/admin”接口,需要具有 admin 角色才可以访问;对于“/user”接口,具备 admin 角色 和 user角色其中任意一个即可访问

对于其他不需要角色就能访问的接口,直接在 WebMvc 中配置即可

@Configurationpublic class WebMvcConfig implements WebMvcConfigurer{    @Override    public void addViewControllers(ViewControllerRegistry registry) {        registry.addViewController("/login").setViewName("login");        registry.addViewController("/index").setViewName("index");        registry.addViewController("/unauthorized").setViewName("unauthorized");    }}

接下来创建全局异常处理器进行全局异常处理,此处主要是处理授权异常

@ControllerAdvicepublic class ExceptionController {    @ExceptionHandler(AuthorizationException.class)    public ModelAndView error(AuthorizationException e) {        ModelAndView mv = new ModelAndView("unauthorized");        mv.addObject("error", e.getMessage());        return mv;    }}

当用户访问未授权的资源时,跳转到 unauthorized 视图中,并携带出错误信息。

配置完成后,最后在 resources/templates 目录下创建 5 个 HTML 页面进行测试。

(1)index.html

lns:shiro="http://www.pollix.at/thymeleaf/shiro">        Title

Hello,

注销登录

管理员页面

普通用户页面

(2)login.html

        Title



(3)user.html

        Title

普通用户页面

(4)admin.html

        Title

管理员页面

(5)unauthorized.html

        Title

未获授权,非法访问

3. 测试

启动项目,访问登录页面,使用 sang/123 登录

注意:由于 sang 用户不具备 admin 角色,因此登录成功后的页面没有前往管理员页面的超链接。

然后使用 admin/123 登录。

如果用户使用 sang 登录,然后去访问:http://localhost:8080/admin,会跳转到未授权页面

标签: shiro框架教程

本文地址:https://www.lifejia.cn/news/206140.html

免责声明:本站内容仅用于学习参考,信息和图片素材来源于互联网,如内容侵权与违规,请联系我们进行删除,我们将在三个工作日内处理。联系邮箱:cloudinto#qq.com(把#换成@)