环境:Springboot2.4.12 + Spring Security 5.4.9
网站的建设创新互联建站专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为自拌料搅拌车等企业提供专业服务。
本篇主要内容是基于内存的配置
org.springframework.boot spring-boot-starter-security
spring: security: user: name: admin password: 123456
@RestController@RequestMapping("/demos")public class DemoController { @GetMapping("home") public Object home() { return "demos home" ; }}
访问:
http://localhost:8080/demos/home。
将会自动跳转到默认地登录页面:
使用配置文件中配置的admin/123123进行登录。
没有任何问题
再定义一个POST接口。
@PostMapping("post")public Object post() { return "demos post" ;}
注意:这里我们通过Postman访问默认的登录/login接口先进行登录,登录完成后我们在访问这个post接口。(记住我们在上面访问的GET /demos/home接口只要登录后就可以继续访问该接口)。
首次登录时注意返回的登录页面的html内容,表单信息中多了一个隐藏域_csrf字段,如果我们通过Postman模拟登录时如果不带上该字段将无法登录。
修改登录信息添加上_csrf表单字段,再进行登录。
这里返回404状态码是由于我们没有配置默认登录成功页
到此在Postman中就登录成功了,接下来咱们继续通过Postman访问GET /demos/home接口。
直接访问没有任何问题
接着访问上面定义的POST /demos/post接口。
服务端返回403拒绝访问,上面GET方式正常,POST出现该异常,接着将上面我们登录时候的_csrf字段一起进行提交。
针对POST请求必须携带正确的_csrf信息才能继续方法。
在默认情况下Security会添加CsrfFilter过滤器。
public final class CsrfFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 从默认的HttpSessionCsrfTokenRepository中获取token,默认是从session中 CsrfToken csrfToken = this.tokenRepository.loadToken(request); boolean missingToken = (csrfToken == null); if (missingToken) { // 如果当前session不存在则生成token csrfToken = this.tokenRepository.generateToken(request); // 如果csrfToken不为null,则这里什么都不做(不会保存) this.tokenRepository.saveToken(csrfToken, request, response); } // ... // 判断当前的请求方法是否是("GET", "HEAD", "TRACE", "OPTIONS") // 如果是上面的Method则直接放行,否则继续往下执行 if (!this.requireCsrfProtectionMatcher.matches(request)) { filterChain.doFilter(request, response); return; } // 从请求header中获取_csrf值,headerName = X-CSRF-TOKEN String actualToken = request.getHeader(csrfToken.getHeaderName()); if (actualToken == null) { // 如果header中不存在,则从请求参数中获取 parameterName = _csrf actualToken = request.getParameter(csrfToken.getParameterName()); } // 判断当前参数中的token值与保存到当前session中的是否想到,不等则返回403错误 if (!equalsConstantTime(csrfToken.getToken(), actualToken)) { AccessDeniedException exception = (!missingToken) ? new InvalidCsrfTokenException(csrfToken, actualToken) : new MissingCsrfTokenException(actualToken); this.accessDeniedHandler.handle(request, response, exception); return; } filterChain.doFilter(request, response); }}
一般我们都会关闭csrf功能。
@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 关闭csrf,就是删除CsrfFilter过滤器。 http.csrf().disable() ; // 拦截任意请求 http.authorizeRequests().anyRequest().authenticated() ; // 这里需要加上该句,否则不会出现登录页面 http.formLogin() ; }}
以上是关于Spring Security默认配置的情况下csrf相关问题。接下来通过自定义类配置来设定用户的用户信息。
@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @SuppressWarnings("deprecation") @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 这在后续的文章中会介绍该方法的具体使用 // super.configure(auth); // 配置用户名密码角色,及密码编码方式 auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance()).withUser("guest").password("123456").roles("ADMIN") ; } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() ; http.authorizeRequests().anyRequest().authenticated() ; http.formLogin() ; }}
通过上面配置后,在进行授权的时候就需要使用这里的配置信息。
本篇介绍到这里,下篇将介绍具体的请求拦截配置及自定义登录页面等功能更。
网站名称:SpringSecurity权限控制系列(一)
当前URL:http://www.mswzjz.cn/qtweb/news14/108314.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能