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. 浅入深出的微前端MicroApp

    前言: 本文是由最近做的一个项目有感而发,因为之前做了一些技术栈的统一,为了用ant Design的pro-table,PC统一使用react,但是我们有一些老的项目是vue的,本次新页面较多,老页面 ...

  2. C++的extern关键字在HotSpot VM中的重要应用

    extern关键字有两个用处: (1)extern在C/C++语言中表示函数和全局变量作用范围(可见性)的关键字,这个关键字会告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. (2)在C+ ...

  3. 【知识杂谈#1】Linux如何安装net-tools和sbin配置PATH

    1. Linux下载net-tools 在Linux上下载net-tools包的方法可能会因你所使用的Linux发行版而有所不同.在某些现代的Linux发行版中,net-tools已经被弃用,而推荐使 ...

  4. 第一次git上传的完整流程

    第一次git上传的完整流程 使用git简单命令上传代码push到远程仓库 + 简单介绍了一个.git文件结构. 代码上传到gitee和github流程一样的,不过你上传到github可能网不行失败,所 ...

  5. vscode没有完全汉化怎么办? vs code部分内容没汉化的解决办法

  6. ERROR: <bits/stdc++.h>, 'cstdalign' file not found, running C++17

    Modified 1 year, 1 month ago Viewed 9k times 4 I'm trying to run a piece of code in Visual Studio Co ...

  7. MongoDB数据的导出导入及日志分析

    一.远程连接导出报错超时 mongodump -h 10.110.63.150:27017 -u'admin' -p'passwd!' --authenticationDatabase flowtes ...

  8. idea修改默认maven配置

    idea修改默认maven配置 方法一 (不推荐) 打开project.default.xml文件,在其中加入如下几行配置. 代码如下 保存修改之后新建一个maven项目查看效果 方法二 新增Proj ...

  9. JVM Stack and Frame

    Overview Sharing a single thread within the district: PC Register/JVM Stack/Native Method Stack.All ...

  10. HTML DOM 之一:访问、修改、删除HTML内容

    什么是 DOM? DOM 是 W3C(万维网联盟)的标准. DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和 ...