1.Spring Boot 框架简介
Spring的诞生是java企业版(Java Enterprise Edition,J2EE)的轻量级代替品,无需开发重量级Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的java对象实现EJB的功能。
虽然spring的组件代码是轻量级的,但是它的配置却是重量级的。
Spring boot 简化了基于spring的应用开发,只需要”run"就能创建一个独立的、生产级别的spring应用。springboot 为spring平台及第三方库提供开箱即用的设置(提供默认配置)。
2.Shiro框架简介
Apache Shiro 是一个Java安全框架,执行身份验证、授权、密码学和会话管理
Apache Shiro 体系结构:
- Authentication 认证--------用户登录
- Authorizaiton 授权-----用户具体有哪些权限
- Cryptography 安全数据加密
- Session Management 会话管理
3.Spring boot 与Shiro整合实现用户认证
3.1 分析Shiro的核心API
Subject: 用户体(把操作交给SecurityManager)
SecurityManager: 安全管理器(关联Realm)
Realm: shiro链接数据的桥梁
3.2 Spring boot整合Shiro
3.2.1 导入shiro与spring整合依赖
修改pom.xml文件
3.2.2 自定义Real类
/**
* 之定义Realm
*/
public class UserRealm extends AuthorizingRealm {
/**
* 执行授权逻辑
*
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
return null;
}
/**
* 执行认证逻辑
*
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行认证逻辑");
return null;
}
}
3.2.3 编写shiro配置类
/**
* shiro配置类
*/
@Configuration
public class ShiroConfig {
/**
* 创建ShiroFilterFactoryBean
*/
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
return shiroFilterFactoryBean;
}
/**
* 创建DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
}
/**
* 创建Realm
*/
@Bean(name = "userRealm")
public UserRealm getRealm(){
return new UserRealm();
}
}
3.2.4 使用shiro内置过滤器实现页面拦截
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* shiro配置类
*/
@Configuration
public class ShiroConfig {
/**
* 创建ShiroFilterFactoryBean
* getShiroFilterFactoryBean完成后,应该使用bean注解,
* 把shiroFilterFactoryBean放入spring中,让spring知道创建了一个shiroFilterFactoryBean对象
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
//添加shiro内置过滤器
/**
* shiro内置过滤器,可以实现权限相关的拦截器
* 常用的过滤器:
* anon:无需认证(登录)可以访问
* authc:必须认证才可以访问
* user:如果使用rememberMe的功能可以直接访问
* perms:该资源必须得到资源权限才可以访问
* role:该资源必须得到角色权限才可以访问
*/
Map<String, String> filterMap = new LinkedHashMap<String, String>();
/**
* 已 "/add"开头的接口 ,使用authc过滤
*/
filterMap.put("/add", "authc");
filterMap.put("/update", "authc");
//user目录下的所有都是要authc权限
// filterMap.put("/user/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
//修改调整的登录页面
shiroFilterFactoryBean.setLoginUrl("/toLogin");
return shiroFilterFactoryBean;
}
3.3 实现用户认证(登录)操作
3.3.1 编写controller的逻辑
@RequestMapping("/login")
public String login(String name,String password){
/**
* 使用shiro编写认证操作
*/
// 1.获取Subject
Subject subject= SecurityUtils.getSubject();
// 2. 封装用户数据
UsernamePasswordToken token=new UsernamePasswordToken(name,password);
// 3.执行登录方法
try {
subject.login(token);//只要走login方法就会执行ShiroConfig中的DefaultWebSecurityManager方法(认证逻辑)
//登录成功
// 跳转到test.html,redirect跳转
return "redirect:/testThymeleaf";
}catch (IncorrectCredentialsException e){
e.printStackTrace();
/**
* 密码错误 IncorrectCredentialsException
*/
model.addAttribute("msg","密码错误");
return "login";
}catch (UnknownAccountException e){
/**
* 登录失败:用户名不存在 UnknownAccountException
*/
model.addAttribute("msg","用户名不存在");
return "login";
}
}
3.3.2 编写Realm的判断逻辑
/**
* 之定义Realm
*/
public class UserRealm extends AuthorizingRealm {
/**
* 执行授权逻辑
*
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
return null;
}
/**
* 执行认证逻辑
*
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
System.out.println("执行认证逻辑");
//假设数据库的用户名和密码;
String name="ano";
String password="123456";
//编写shiro判断逻辑,判断用户名和密码
// 1.判断用户名
if(!token.getUserName().equals(name)){
// 用户名不存在
return null;//shiro底层会抛出UnknownAccountException
}
// 2.判断密码
return new SimpleAuthenticationInfo("",password,"");
}
}
4. mybatis整合
4.1导入mybatis相关依赖
4. 2 配置文件 application.properties
位置:根目录src/main/resources
参数:连接数据库的参数、 阿里连接池参数
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/yunshan?characterEncoding=utf-8&useSSL=true&useUnicode=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.alibaba.druid.pool.Druid