springsecurity6配置自定义路径身份认证的实现

 更新时间:2025年03月14日 11:40:21   作者:qq_43746935  
本文主要介绍了springsecurity6配置自定义路径身份认证的实现,通过使用自定义的AuthorizationManager和MyService,可以实现更灵活的访问控制,感兴趣的可以了解一下

Spring Security 6 作为最新版本,引入了许多新特性和改进,例如对 Spring Framework 6 的支持、新的默认密码编码器、更简洁的配置方式等。

springsecurity6配置自定义路径身份认证 .anyRequest().authenticated()替换成
.anyRequest().access(new CustomAuthorizationManager(myService))

CustomAuthorizationManager

package com.example.springscuritydemo.config;

import com.example.springscuritydemo.service.MyService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.authorization.AuthorizationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.access.intercept.RequestAuthorizationContext;

import java.util.function.Supplier;

public class CustomAuthorizationManager implements AuthorizationManager<RequestAuthorizationContext> {

    private final MyService myService;

    public CustomAuthorizationManager(MyService myService) {
        this.myService = myService;
    }

    @Override
    public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext context) {
        HttpServletRequest request = context.getRequest();
        Authentication auth = authentication.get();
        if (auth == null) {
            return new AuthorizationDecision(false);
        }
        return new AuthorizationDecision(myService.hasPermission(request, auth));
    }
}

MyService

package com.example.springscuritydemo.service;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.Authentication;

public interface MyService {
    boolean hasPermission(HttpServletRequest request, Authentication authentication);
}

MyServiceImpl

package com.example.springscuritydemo.service.impl;

import com.example.springscuritydemo.service.MyService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;

import java.util.Collection;
@Service
public class MyserviceImpl implements MyService {
    @Override
    public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
        Object obj = authentication.getPrincipal();
        if (obj instanceof UserDetails) {
            UserDetails userDetails = (UserDetails) obj;
            Collection<? extends GrantedAuthority> authorities = userDetails.getAuthorities();
            boolean contains = authorities.contains(new SimpleGrantedAuthority(request.getRequestURI()));
            return contains;
        }
        return false;
    }
}

package com.example.springscuritydemo.config;

import com.example.springscuritydemo.handle.MyAccessDeniedHandler;
import com.example.springscuritydemo.handle.MyAuthenticationSuccessHandler;
import com.example.springscuritydemo.service.MyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.access.expression.WebExpressionAuthorizationManager;

@EnableWebSecurity
@Configuration
public class SecurityConfig{
    @Autowired
    private MyAccessDeniedHandler myAccessDeniedHandler;
//    @Autowired
//    private MyAuthenticationFailureHandler myAuthenticationFailureHandler;
    private final MyService myService;

    public SecurityConfig(MyService myService) {
        this.myService = myService;
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        return  http
                .formLogin(formLogin -> formLogin.loginPage("/login.html")

                        .loginProcessingUrl("/login")
                        //.successForwardUrl("/toMain")
                        .successHandler(new MyAuthenticationSuccessHandler("/main.html"))
                         .failureUrl("/toError")
                        //.failureHandler(new MyAuthenticationFailureHandler("/error.html"))

                )
                .authorizeHttpRequests(auth -> auth.requestMatchers("/toError","/login.html","/error.html").permitAll()
                                //需要认证才能访问,是security的认证。不是jwt的认证登录后访问
                                
                        .requestMatchers("/js/**","/css/**","/img/**").permitAll()

                        .requestMatchers("main1.html")
                        .access(new WebExpressionAuthorizationManager("isAuthenticated() and hasIpAddress('192.168.10.6')"))

                        //其他路径需要身份认证
//                        .anyRequest().authenticated()
                                .anyRequest().access(new CustomAuthorizationManager(myService))
                )
                .csrf(httpSecurityCsrfConfigurer -> httpSecurityCsrfConfigurer.disable())
                // 构建并返回安全过滤链
                .build();
    }

}

到此这篇关于springsecurity6配置自定义路径身份认证的实现的文章就介绍到这了,更多相关springsecurity6自定义路径身份认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • spring-cloud-stream结合kafka使用详解

    spring-cloud-stream结合kafka使用详解

    这篇文章主要介绍了spring-cloud-stream结合kafka使用详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

    SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

    在开发Spring Boot RESTful API时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON解析错误(如400 Bad Request)是常见的开发问题之一,本文将通过一个实际案例,详细分析如何排查和解决JSON解析错误,并总结最佳实践,需要的朋友可以参考下
    2025-06-06
  • java中break和continue区别及使用场合分析

    java中break和continue区别及使用场合分析

    本文力图通过实例加使用场合详解来引导菜鸟重新认识break和continue语句,需要的朋友可以参考下
    2014-01-01
  • Spring中的FactoryBean实现原理详解

    Spring中的FactoryBean实现原理详解

    这篇文章主要介绍了Spring中的FactoryBean实现原理详解,spring中有两种类型的Bean,一种是普通的JavaBean,另一种就是工厂Bean(FactoryBean),这两种Bean都受Spring的IoC容器管理,但它们之间却有一些区别,需要的朋友可以参考下
    2024-02-02
  • Java毕业设计实战之财务预算管理系统的实现

    Java毕业设计实战之财务预算管理系统的实现

    这是一个使用了java+SSM+Jsp+Mysql+Layui+Maven开发的财务预算管理系统,是一个毕业设计的实战练习,具有财务预算管理该有的所有功能,感兴趣的朋友快来看看吧
    2022-02-02
  • Java中wait()与sleep()两者的不同深入解析

    Java中wait()与sleep()两者的不同深入解析

    在Java多线程编程中,wait()和sleep()是控制线程执行和等待的两个关键方法,但它们在应用场景和实现上有显著差异,这篇文章主要介绍了Java中wait()与sleep()两者的不同,需要的朋友可以参考下
    2024-11-11
  • Spring Boot + Vue 前后端分离项目如何踢掉已登录用户

    Spring Boot + Vue 前后端分离项目如何踢掉已登录用户

    这篇文章主要介绍了Spring Boot + Vue 前后端分离项目如何踢掉已登录用户,需要的朋友可以参考下
    2020-05-05
  • Spring成为Java开发的标准以及SpringBoot如何彻底改变开发体验

    Spring成为Java开发的标准以及SpringBoot如何彻底改变开发体验

    本文深入剖析了Spring框架及其在Java企业级应用开发中的地位,强调了Spring通过IoC容器、AOP和模块化生态系统等核心特性,解决了一系列传统JavaEE开发的痛点,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • springmvc path请求映射到bean 方法的流程

    springmvc path请求映射到bean 方法的流程

    这篇文章主要介绍了springmvc path请求映射到bean 方法的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Spring实战之Bean的作用域request用法分析

    Spring实战之Bean的作用域request用法分析

    这篇文章主要介绍了Spring实战之Bean的作用域request用法,结合实例形式分析了spring中Bean的request作用域相关使用技巧与操作注意事项,需要的朋友可以参考下
    2019-11-11

最新评论