1:shiro是什么?

  • Apache Shiro 是ASF旗下的一款开源软件
  • shrio是一款强大而灵活的安全框架
  • 可为任何应用提供安全保障— 从命令行应用、移动应用到大型网络及企业应用

2:shiro的四大基石:

  • 认证(Authentication):用户身份识别。有时可看作为“登录”,它是用户证明自己是谁的一个行为。
  • 授权(Authorization):访问控制过程,好比决定“认证谁” 可以访问它”。
  • 会话管理(SessionManagement):管理用户的会话,甚至在没有WEB或EJB容器的环境中。管理用户与时间相关的状态。
  • 加密(Cryptography):使用加密算法保护数据更加安全,防止数据被偷窥。
  • 但此外还有一些附加的功能进行支持和加强比如:
  • Web支持:利用Shiro的web支持API可以很容易地实现web程序安全;
  • shiro支持并发

3:介绍完shiro了 让我们开始搭建第一个shiro项目吧

  • 创建一个spring boot项目导入maven依赖:
        <dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

导入maven环境之后 写一个:UserRealm类来继承AuthorizingRealm并重写它的两个方法

public class UserRealm extends AuthorizingRealm {
@Override //授权方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("doGetAuthorizationInfo授权方法执行了");
return null;
}
//认证方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("doGetAuthenticationInfo认证方法执行了");
return null;
} }

重写方法之后配置shiro的配置类:ShrioComfig:

@Configuration
public class ShrioComfig {
//第三步:
@Bean
public ShiroFilterFactoryBean Bean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);
Map<String,String>map=new LinkedHashMap();
map.put("/user/update","authc");
map.put("/user/add","authc");
bean.setFilterChainDefinitionMap(map);
//设置如果拦截则切换到登录页面
bean.setLoginUrl("/login");
return bean;
} //第二步:DefaultWebSecurityManager
@Bean
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
}
//第一步:创造realm对象 需要自定义类
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
}

然后再写一个控制层:MyController:

@Controller
public class MyController { @RequestMapping({"/","/index"})
public String toIndex(Model model){
model.addAttribute("msg","hello Shrio!");
return "index";
}
@RequestMapping("/user/add")
public String goadd(){
return "/user/add";
}
@RequestMapping("/user/update")
public String update() {
return "/user/update";
}

在templates包中写一个首页(index)页面:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<p th:text="${msg}"></p>
<a th:href="@{/user/add}">add</a>
<a th:href="@{/user/update}">update</a>
</body>
</html>

在templates中添加一个user包然后写两个add和update页面:

add:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>add</h1>
</body>
</html>

update:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>update</h1>
</body>
</html> 

开启测试:如果点进链接可以进去

那么我们的第一个shiro项目就完成了

那么我们开启进阶的第一步把 spring boot整合shiro和mybatis

第一步导入依赖:

  <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

 配置application.yaml文件和application.properties:

application.properties:

mybatis.type-aliases-package=com.kuang.pojo

application.yaml:

spring:
datasource:
username: root
password: 5825600
#填写你的mysql密码和账户
#?serverTimezone=UTC解决时区的报错
url: jdbc:mysql://localhost:3306/luyunjie?useSSL=false&useUnicode=false&characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的,需要自己绑定
#druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

配置完环境 我们配置mybatis的实现类User:

属性跟你的mysql数据库的字段对应

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String loginName;
private String loginPwd;
}

写出UserMapper接口:

@Repository
@Mapper
public interface UserMapper {
@Select("select * from t_user where loginName=#{loginName}")
//不建议用注解 因为有些情况太复杂的sql编写不了
public User getuser(String loginName);
}

  再写一个业务层UserSverice:

public interface UserService {
public User getuser(String loginName);
}

  再写UserSverice的实现类:

@Service
public class UserServiceImp implements UserService {
@Autowired
UserMapper userMapper;
@Override
public User getuser(String loginName) {
return userMapper.getuser(loginName);
}
}

  去ShrioApplicationTests测试类一下:

@SpringBootTest
class ShrioApplicationTests {
@Autowired
UserServiceImp userServiceImp;
@Test
void contextLoads() {
System.out.println(userServiceImp.getuser("lyj"));
}
}

  如果可以查询到数据库数据就证明你的环境配好了:

那么我们的可以去进行连接数据库的操作了 

来提个要求 如果没有登录点击add和update就要登录才能进入:

第一步:

  在MyController中添加一个返回登录页面的和获得当前用户并封装和返回异常的方法:

   @RequestMapping("/login")
public String login() {
return "/login"; }
@RequestMapping("/tologin")
public String login(String username,String password,Model model) {
//获取当前的用户
Subject subject = SecurityUtils.getSubject();
//封装当前用户的数据
UsernamePasswordToken user=new UsernamePasswordToken(username,password);
try{
subject.login(user);
return "index";
}catch (UnknownAccountException e){
model.addAttribute("msg","账户错误");
return "login";
}catch (IncorrectCredentialsException e){
model.addAttribute("msg","密码错误");
return "login";
} }

第二步:

  在templates写出一个登录(login)页面:

<!DOCTYPE html>
<html lang="en"xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录</h1>
<br>
<p th:text="${msg}" style="color: red;"></p>
<form th:action="@{/tologin}">
<p>用户<input type="text" name="username" ></p>
<p>密码<input type="text" name="password" ></p>
<p><input type="submit"></p>
</form>
</body>
</html>

第三步:

  去我们的UserRealm类中完善方法:

public class UserRealm extends AuthorizingRealm {
@Autowired
UserServiceImp userServiceImp;
@Override//授权方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("doGetAuthorizationInfo授权方法执行了");
return null;
}
//认证方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("doGetAuthenticationInfo认证方法执行了"); UsernamePasswordToken user= (UsernamePasswordToken) authenticationToken;
//获得密码
User getuser = userServiceImp.getuser(user.getUsername());
if (getuser==null){
return null;
        //返回null就自动提式用户错误
}
return new SimpleAuthenticationInfo("",getuser.getLoginPwd(),"");
}
}

第四步:

  在ShrioComfig类中完善方法 设定如果没有登录就拦截:

  //第三步:ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean Bean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);
Map<String,String>map=new LinkedHashMap();
map.put("/user/update","authc");
map.put("/user/add","authc");
bean.setFilterChainDefinitionMap(map);
//设置如果拦截则切换到登录页面
bean.setLoginUrl("/login");
return bean;
}

第四步:

进行测试:如果登录成功则可访问add和update页面;

      如果成功则可进入add和update页面 则测试成功!

                      这是shiro的一个小入门 以后会给大家带来更好的教程 小白努力学习的每一天

 

Spring Boot与Shiro和Mybatis整合的更多相关文章

  1. 快速搭建Spring Boot + Apache Shiro 环境

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Apache Shiro 介绍及概念 概念:Apache Shiro是一个强大且易用的Java安全框 ...

  2. 基于Spring Boot和Shiro的后台管理系统FEBS

    FEBS是一个简单高效的后台权限管理系统.项目基础框架采用全新的Java Web开发框架 —— Spring Boot 2.0.3,消除了繁杂的XML配置,使得二次开发更为简单:数据访问层采用Myba ...

  3. 6、Spring Boot 2.x 集成 MyBatis

    1.6 Spring Boot 2.x 集成 MyBatis 简介 详细介绍如何在Spring Boot中整合MyBatis,并通过注解方式实现映射. 完整源码: 1.6.1 创建 spring-bo ...

  4. 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)

    MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...

  5. Spring Boot 添加Shiro支持

    前言: Shiro是一个权限.会话管理的开源Java安全框架:Spring Boot集成Shiro后可以方便的使用Session: 工程概述: (工程结构图) 一.建立Spring Boot工程 参照 ...

  6. Spring Boot 集成Shiro和CAS

    Spring Boot 集成Shiro和CAS 标签: springshirocas 2016-01-17 23:03 35765人阅读 评论(22) 收藏 举报  分类: Spring(42)  版 ...

  7. 解决Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of the configured nodes are available

    Spring Boot(2.1.3.RELEASE)整合spring-data-elasticsearch3.1.5.RELEASE报NoNodeAvailableException[None of ...

  8. spring boot 2.0.0 + mybatis 报:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

    spring boot 2.0.0 + mybatis 报:Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required 无法启动 ...

  9. spring boot打印sql语句-mybatis

    spring boot打印sql语句-mybatis 概述 当自己编写的程序出现了BUG等等,找了很久 调试运行了几遍到mapper层也进去调试进了源码,非常麻烦 我就想打印出sql语句,好进行解决B ...

  10. Spring Boot 2.0 快速集成整合消息中间件 Kafka

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site ...

随机推荐

  1. 一种对数据库友好的GUID的变种使用方法

    概述 .NET生成的GUID唯一性很好,用之方便,但是,缺少像雪花算法那样的有序性.虽然分布式系统中做不到绝对的有序,但是,相对的有序对于目前数据库而言,索引效率等方面的提升还是有明显效果的(当然,我 ...

  2. Android news Display Owner Info on Your Android Device in Case It Gets Lost

    Display Owner Info on Your Android Device in Case It Gets Lost The latest versions of Android includ ...

  3. RAC 环境中 gc block lost 和私网通信性能问题的诊断

    声明:此文来自于MOS(Doc ID 1674865.1),整理在此以便于大家阅读学习. ■ 概要 在Oracle的RAC环境中,数据库会收集global cache 的工作负载统计信息,并把这些信息 ...

  4. 触发器引起的ADG备库同步错误

    数据库alert日志报错ORA-16000,查看对应的trc文件,大致如下报错: *** 2020-10-27 14:09:03.340*** SESSION ID:(3340.75) 2020-10 ...

  5. P9140 [THUPC 2023 初赛] 背包

    prologue 这很难评(调了我 1h,我都想紫砂了. 还是典型得不重构就看不见系列. analysis 如果我们还是一个正常人,那么我们大体上是能看到题目的加粗字,这个格式很明显符合我们的同余最短 ...

  6. [ABC321C] 321-like Searcher

    Problem 题目简述 给你一个 \(K\),求出 \([1 \sim K]\) 区间内有多少个 321-like Number. 321-like Number 的定义: 每一位上的数字从左到右严 ...

  7. 推荐一个Node.js多版本管理的可视化工具

    关于Node.js的开发者来说,在开发机器上管理多个不同版本的Node.js是一个常见痛点.之前在开发者安全大全专栏中,提到过解决方法:使用nvm,如果对于nvm还不了解的话,可以前往了解. 对于TJ ...

  8. C/C++字符函数库<ctype.h>/<cctype>(常用)

    头文件:<ctype.h> 形式:int 函数(int c)  参数:传入的一定是一个字符或者EOF 返回值:满足条件返回非0(true),否则返回0: int isalnum(int c ...

  9. Cadence SPB 22.1 -- 原理图的电器元件放置03Day

    1.新增原理图:"SCHEMATIC"-->"New Page" 2.元器件放置 ①.添加原理图库 ②.放置元器件 选择对应元件库,再选择需要放置的元件, ...

  10. 洛谷P2579 [ZJOI2005]沼泽鳄鱼(矩阵快速幂,周期)

    例题:现在豆豆已经选好了两座石墩Start和End,他想从Start出发,经过K个单位时间后恰好站在石墩End上.假设石墩可以重复经过(包括Start和End),他想请你帮忙算算,这样的路线共有多少种 ...