Spring Boot 整合 Shiro

Shiro简介

Apache Shiro 是一个开源的轻量级的 Java 安全框架,它提供身份验证,授权,密码管理以及会话管理等功能,相对于 Spring Security ,Shiro 框架更加直观,易用,同时也能提供健壮的安全性。
1.创建项目,添加如下依赖:

     <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.4.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>com.github.theborakompanioni</groupId><artifactId>thymeleaf-extras-shiro</artifactId><version>2.0.0</version></dependency>

2.Shiro 基本配置,在application.properties中进行配置如下代码

#开启Shrio配置
shiro.enabled=true
#开启Shiro Web配置
shiro.web.enabled=true
#默认的登陆地址
shiro.loginUrl=/login
#登陆成功后的地址
shiro.successUrl=/index
#未授权默认跳转地址
shiro.unauthorizedUrl=/unauthorized
#是否允许通过URL参数实现会话跟踪,如果网站支持Cookie,可以关闭此选项
shiro.sessionManager.sessionIdUrlRewritingEnabled=true
#是否允许通过Cookie实现会话跟踪
shiro.sessionManager.sessionIdCookieEnabled=true

3.配置 Shiro

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.TextConfigurationRealm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ShiroConfig {@Beanpublic Realm realm() {TextConfigurationRealm realm = new TextConfigurationRealm();realm.setUserDefinitions("sang=123,user\n admin=123,admin"); //这里配置了两个用户realm.setRoleDefinitions("admin=read,write\n user=read");   //admin具有读写权限,user具有读权限return realm;}@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();chainDefinition.addPathDefinition("/login","anon");     //匿名访问chainDefinition.addPathDefinition("/doLogin","anon");   //匿名访问chainDefinition.addPathDefinition("/logout","logout");  //注销登陆chainDefinition.addPathDefinition("/**","authc");       //其他请求需要认证return chainDefinition;}@Beanpublic ShiroDialect shiroDialect() {return new ShiroDialect();  //支持在 Themyleaf 中使用 Shiro 标签}
}

4.配置登陆接口以及页面访问接口

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;@Controller
public 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方法执行登陆操作,在登陆操作执行过程中,当有异常出现时,说明登陆失败,并将错误信息返回给前端页面

对于其他不需要角色就能访问的接口,直接在WebMvc中配置就行,代码如下:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/login").setViewName("login");registry.addViewController("/index").setViewName("index");registry.addViewController("/unauthorized").setViewName("unauthorized");}
}

5.创建全局异常处理器进行全局异常处理

import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;@ControllerAdvice
public class ExceptionController {@ExceptionHandler(AuthorizationException.class)public ModelAndView error(AuthorizationException e) {ModelAndView mv = new ModelAndView("unauthorized");mv.addObject("error",e.getMessage());return mv;}
}
当用户访问未授权的资源时,自动跳转到 unauthorized 这个视图中,并把错误信息显示出来
配置完成后,最后在 resources/template 目录下创建HTML页面进行测试

(1)index.html 首页

<!DOCTYPE html>
<html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3>Hello, <shiro:principal/></h3><h3><a href="/logout">注销登录</a></h3><h3><a shiro:hasRole="admin" href="/admin">管理员页面</a></h3><h3><a shiro:hasAnyRoles="admin,user" href="/user">普通用户页面</a></h3>
</body>
</html>

(2) login.html 登陆页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div><form action="/doLogin" method="post"><input type="text" name="username"> <br><input type="password" name="password"> <br><div th:text="${error}"></div><input type="submit" value="登陆"></form>
</div>
</body>
</html>

(3) user.html 普通用户页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>普通用户页面</title>
</head>
<body>
<h1>普通用户页面</h1>
</body>
</html>

(4) admin.html 管理员页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>管理员页面</title>
</head>
<body>
<h1>管理员页面</h1>
</body>
</html>

(5) unauthorized.html 未授权页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>未获授权,非法访问</h3>
<h3 th:text="${error}"></h3>
</body>
</html>

6.进行测试

启动项目,访问登陆页面,分别使用 sang/123 和 admin/123 进行访问,结果如下图所示

sang 用户登陆后所展示的内容


————————————————————————————

admin 用户登陆后所展示的内容


————————————————————————————

登陆成功后,无论 sang 还是 admin 用户,单击 注销登录 都会注销成功,然后回到登陆页面, sang 用户因为不具备管理员权限,因此没有管理员页面的超链接,无法进入管理员页面,如果sang用户手动在地址栏中输入管理员的地址 http:localhost:8080/admin ,则会跳转到未授权页面,如下所示:

注意,必须先用 sang 用户登陆成功后在访问管理员网址才会产生这种结果

这些就是 shiro 的简单使用!

SpringBoot安全管理 ——模块4:Spring Boot 整合 Shiro相关推荐

  1. Spring Boot整合Shiro + Springboot +vue

    目录 02 Spring Boot整合Shiro p1.shiro概述 1 什么是Shiro 2 Shiro核心组件 p2.Shiro实现登录认证 AccountRealm.java QueryWra ...

  2. 六、Spring Boot整合Shiro

    六.Spring Boot整合Shiro 6.1.整合思路 6.2.创建spring boot项目 6.3.引入shiro依赖 6.4.配置shiro环境 创建配置类ShiroConfig 1.配置: ...

  3. Spring Boot 整合 shiro 之盐值加密认证详解(六)

    Spring Boot 整合 shiro 之盐值加密认证详解 概述 不加盐认证 加入密码认证核心代码 修改 CustomRealm 新增获取密文的方法 修改 doGetAuthenticationIn ...

  4. Spring Boot 整合 Shiro(三)Kaptcha验证码 附源码

    前言 本文是根据上篇<Spring Boot 整合Shiro(二)加密登录与密码加盐处理>进行修改,如有不明白的转上篇文章了解. 1.导入依赖 <!-- https://mvnrep ...

  5. Spring Boot整合Shiro + JSP教程(用户认证,权限管理,图片验证码)

    在此首先感谢**编程不良人**up主提供的视频教程 代码都是跟着up的视频敲的,遇到的一些问题也是通过CSDN博主提供的教程解决的,在此也感谢那些提供bug解决方案的前辈们~ 项目完整代码已经发布到g ...

  6. spring boot整合shiro继承redis_Springboot+Shiro+redis整合

    1.Shiro是Apache下的一个开源项目,我们称之为Apache Shiro.它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理,与spring Security 一样都是 ...

  7. spring boot整合shiro+jjwt

    前言 本篇文章将教大家在 shiro + springBoot 的基础上整合 JJWT (JSON Web Token) JWT JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允 ...

  8. spring boot整合Shiro实现单点登录

    默认情况下,Shiro已经为我们实现了和Cas的集成,我们加入集成的一些配置就ok了 1.加入shiro-cas包 <!-- shiro整合cas单点 --><dependency& ...

  9. Spring Boot 整合 Shiro

    虽然,直接用Spring Security和SpringBoot 进行"全家桶式"的合作是最好不过的,但现实总是欺负我们这些没办法决定架构类型的娃子. Apache Shiro 也 ...

  10. spring boot整合shiro继承redis_spring-boot-plus集成Shiro+JWT权限管理

    SpringBoot+Shiro+JWT权限管理 Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以 ...

最新文章

  1. javascript中的事件问题的总结
  2. Spring Boot中使用自定义Annotation来实现接口自动幂等
  3. React Router 黑笔记?
  4. Spring-AOP @AspectJ切点函数之execution()
  5. 转贴 CxImage类库使用说明
  6. 求一个字符串的前缀与另一个字符串的后缀的最大相同子串
  7. powerdesigner mysql 自增主键_PowerDesigner Mysql 主键自增、初始值、字符集
  8. 插画类引导页设计灵感|友好结合,总能带给人惊喜~
  9. 有了门面,程序会更加体面!- pos软件基于三层架构 -09
  10. oracle存储过程的创建与调用,Oracle 存储过程创建及调用
  11. 【C++】使用setprecision控制输出流显示浮点数的有效数字个数
  12. Ubuntu 14.04 + nginx + php + mysql + phpmyadmin环境搭建,详细操作
  13. java自学一般要学多久?学会了有什么作用?
  14. 1分钟教会你如何截图文字识别,建议收藏备用
  15. 如何将epub电子书格式转换成txt文本
  16. IE条件注释意义及用法
  17. html盒子页面居中,网页布局盒子(box)相关属性和盒子居中
  18. windows phone的那些应用们 有意思的,good design的,有用的...
  19. Byval和ByRef
  20. 阿里云服务器断开连接后程序在后台运行办法

热门文章

  1. 虚拟机的不同网络模式
  2. RoaringBitMap学习和实践
  3. IE下载文件时,中文文件名乱码问题
  4. HTML学生个人网站作业设计:班级网站设计——上海学校 4页
  5. Google地图查地址、经纬度
  6. Java实现蓝桥杯 九宫幻方
  7. removeclass 传入两个类_jQuery源码解读之removeClass()方法分析
  8. PSQLException: An I/O error occurred问题排查
  9. 百度背叛激光雷达路线了吗?
  10. div实现页面划分为左,中,右三栏