Spring Boot Security(一)
Spring Security 配置
参考 https://docs.spring.io/spring-security/site/docs/5.4.1/guides/#hello-world
1、首先在 pom.xml 文件中添加 Spring Security
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2、编写配置文件
package com.wkw.bms.test.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* @author : Administrator
* @project : BMS
* @date : 2020/10/20 21:37
**/
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
/**
* 登录表单用户名 name 和密码 name 属性名
*/
private String USER_NAME_ATTRIBUTE = "username";
private String USER_PASSWORD_ATTRIBUTE = "password";
/**
* 规则定义
*/
private String USER_ROLE = "USER";
private String ADMIN_ROLE = "ADMIN";
/**
* 定义授权规则
* @param http
* @throws Exception
*/
@Override
protected void configure (HttpSecurity http)
throws Exception
{
// 认证配置
http.authorizeRequests()
// 登录页面无需权限
.antMatchers("/login","/error","/about").permitAll()
// 过滤掉静态文件
.antMatchers("/css/**","/data/**","/fonts/**","/icons-reference/**","/img/**","/js/**","/vendor/**").permitAll()
// 其他页面都需登录访问
.antMatchers("/**").hasRole(USER_ROLE)
// 系统管理员页面需管理员权限
.antMatchers("/sys/**").hasRole(ADMIN_ROLE)
.anyRequest()
.authenticated();
//登录配置
http.formLogin()
// 自定义的登录页
.loginPage("/login")
// 处理登录请求的 url,和 login.html 中 表单中 action 一致,SpringBoot 将自动进行认证,认证成功之后将请求发送给 successForwardUrl 处理
.loginProcessingUrl("/login-check")
.usernameParameter(USER_NAME_ATTRIBUTE)
.passwordParameter(USER_PASSWORD_ATTRIBUTE)
// 且 successForwardUrl 必须接受 POST 请求
.successForwardUrl("/login-check")
.permitAll()
.and()
.rememberMe();
// 登出配置
http.logout()
.logoutUrl("/logout")
.invalidateHttpSession(true)
.logoutSuccessUrl("/login")
.permitAll()
.and()
.csrf()
.disable();
}
/**
* 定义认证规则
* @param auth
* @throws Exception
*/
@Override
protected void configure (AuthenticationManagerBuilder auth)
throws Exception
{
//super.configure(auth);
auth.inMemoryAuthentication()
.withUser("zolmk").password("zolmk").roles(USER_ROLE,ADMIN_ROLE);
}
@Bean
public PasswordEncoder passwordEncoder()
{
return new com.wkw.bms.test.config.PasswordEncoder();
}
}
3、对应的 Controller
package com.wkw.bms.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author : Administrator
* @project : BMS
* @date : 2020/10/25 19:02
**/
@Controller
@RequestMapping("/")
public class BaseController
{
@RequestMapping(value = {"/login","/login.html"},method = RequestMethod.GET)
public String login()
{
return "login";
}
@RequestMapping(value = {"/login-check"},method = RequestMethod.POST)
public String loginCheck(HttpServletRequest request,HttpServletResponse response)
{
// 在这里传一些信息
return "redirect:index.html";
}
@RequestMapping(value = {"/index","/index.html","/main.html","/"},method = RequestMethod.GET)
public String index()
{
return "index";
}
@RequestMapping(value = {"/charts","/charts.html"},method = RequestMethod.GET)
public String charts()
{
return "charts";
}
@RequestMapping(value = {"/forms","/forms.html"},method = RequestMethod.GET)
public String forms()
{
return "forms";
}
@RequestMapping(value = {"/register","/register.html"},method = RequestMethod.GET)
public String register()
{
return "register";
}
@RequestMapping(value = {"/tables","/tables.html"},method = RequestMethod.GET)
public String tables()
{
return "tables";
}
}
4、对应的 PasswordEncoder(自己定制)
package com.wkw.bms.test.config;
/**
* @author : Administrator
* @project : BMS
* @date : 2020/10/24 22:04
**/
public class PasswordEncoder implements org.springframework.security.crypto.password.PasswordEncoder
{
@Override
public String encode (CharSequence rawPassword)
{
return rawPassword.toString();
}
@Override
public boolean matches (CharSequence rawPassword, String encodedPassword)
{
return rawPassword.toString().equals(encodedPassword);
}
}
__EOF__

本文作者:ZOLMK
本文链接:https://www.cnblogs.com/zolmk/p/14074221.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zolmk/p/14074221.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
分类:
SpringBoot
, 后端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义