观看 黑马的SpringBoot与Shiro整合-权限管理实战视频,根据视频学习 一步一步 实现 SpringBoot +Shiro 整合实现用户认证和权限管理。简单易懂,适合新手学习,分享给大家。
SpringBoot 与Shiro 整合实现用户认证、用户授权
目录
一、SpringBoot 与Shiro 整合实现用户认证(登录)
1.分析shiro的核心API
Subject:用户主体(把操作交给SecurityManager)
SecurityManager:安全管理器(关联Realm)
Realm:Shiro连接数据的桥梁
2.SpringBoot 整合Shiro步骤
2.1 导入 shiro 与spring 整合依赖
pom.xml:
<!-- 导入web支持:SpringMVC开发支持,Servlet相关的程序 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- shiro 与 spring 整合依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
2.2 自定义Realm
package com.koncord.shiro;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
/**
* 自定义 Realm
* @author Administrator
*
*/
public class UserRealm extends AuthorizingRealm{
/**
* 执行授权逻辑
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("执行授权逻辑");
return null;
}
/**
* 执行认证逻辑
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行认证逻辑");
return null;
}
}
2.3 编写Shiro配置类
package com.koncord.shiro;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
/**
* Shiro配置类
* @author Administrator
*
*/
@Configuration
public class ShiroConfig {
/**
* 3.创建ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean =new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
return shiroFilterFactoryBean;
}
/**
* 2.创建 DefaultWebSecurityManager
*/
@Bean(name="securityManager")
public DefaultWebSecurityManager securityManager(@Qualifier("userRealm")UserRealm userRealm){
DefaultWebSecurityManager securityManager =new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
}
/**
* 1.创建Realm
*/
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
}
3.使用Shiro内置的过滤器实现认证资源拦截
修改 配置类ShiroConfig 中的 shiroFilterFactoryBean方法:
/**
* 3.创建ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@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>();
// filterMap.put("/add", "authc");
// filterMap.put("/update", "authc");
filterMap.put("/testThymeleaf", "anon");
filterMap.put("/*", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
//设置登录跳转链接
shiroFilterFactoryBean.setLoginUrl("/toLogin");
return shiroFilterFactoryBean;
}
项目结构:
创建一个UserController类,用于测试 上面的 代码效果:
package com.koncord.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
/**
* 测试
*/
@RequestMapping("/hello")
@ResponseBody
public String hello(){
System.out.println("UserController-hello");
return "ok";
}
/**
* 测试 thymeleaf
*/
@RequestMapping("/testThymeleaf")
public String testThymeleaf(Model model){
//将数据存入model
model.addAttribute("name", "程序猿");
//返回test.html
return "test";
}
/**
* 进入添加页面
*/
@RequestMapping("/add")
public String add(){
return "user/add";
}
/**
* 进入编辑页面
*/
@RequestMapping("/update")
public String update(){
return "user/update";
}
/**
* 进入登录页面
*/
@RequestMapping("/toLogin")
public String toLogin(){
return "login";
}
}
test.html:
<!DOCTYPE html>
<html>
<head>
<title>测试thymeleaf的使用</title>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<h3 th:text="${name}"></h3><br>
<div>进入用户添加页面:<a href="add">用户添加</a></div>
<div>进入用户编辑页面:<a href="update">用户编辑