当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring启动安全性使用UserDetailsService配置多个HttpSecurity?

卞嘉许
2023-03-14

我正在使用Spring引导安全层来验证和授权user.Now,我想使用多超文本传输协议安全配置做一些示例应用程序。我有这样的场景,比如将有两个具有不同URL映射的登录页面(“/Management ementLogin”、“/thersLogin”)。

我可以理解如何配置多httpSecurity配置,但我需要验证用户从两个tables.If管理用户登录我需要验证用户从管理表通过DAO层使用UserDetailsService否则,如果任何其他用户登录我需要从other_users表验证。

有人能帮我知道如何使用UserDetailsService配置带有Spring启动安全性的超文本传输协议配置和道层吗?

这是我的基本代码片段,

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {


    @Autowired
    @Qualifier("userDetailsService")
    UserDetailsService userDetailsService;

    @Autowired
    private RESTAuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    private RESTAuthenticationFailureHandler authenticationFailureHandler;
    @Autowired
    private RESTAuthenticationSuccessHandler authenticationSuccessHandler;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // for testing authentication purpose using inMemory db
        /*
         * auth.inMemoryAuthentication().withUser("user").password("user").roles
         * ("USER").and().withUser("admin") .password("admin").roles("ADMIN");
         */

        // Dao based authentication
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/", "/home").permitAll();
        http.authorizeRequests().antMatchers("/rest/**").authenticated();
        http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);
        http.formLogin().successHandler(authenticationSuccessHandler);
        http.formLogin().failureHandler(authenticationFailureHandler);
        http.logout().logoutSuccessUrl("/");

        // CSRF tokens handling
        http.addFilterAfter(new CsrfTokenResponseHeaderBindingFilter(), CsrfFilter.class);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web
          .ignoring()
          .antMatchers("/registerUser","/register.html");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        return encoder;
    }
}

TIA。。,

共有3个答案

沙星波
2023-03-14

实际上,您将需要使用两个用户详细信息服务。但是,这还不够。我建议您创建另一个具有不同顺序的 ApplicationSecurity2 类。

Spring Security性建立在过滤器链的有序列表上。

看看Dave Sayer在这里给出的答案。然后,您可以根据需要处理不同的URL。

支劲
2023-03-14

用他自己的UserDetailsService实现两个DaoAuthenticationProvider,并将这两个提供者注入authenticationManager。

我不知道两个不同的登录endpoint需要什么,但一开始我认为这是个坏主意。您可以创建不同的身份验证对象,并让AuthenticationManager根据supports方法选择正确的身份验证提供程序。

商华藏
2023-03-14

实现自定义UserDetailsService,如下所示:

@Service
public class CustomUserDetailsService implements UserDetailsService {

  @Autowired
  private UserDaoTableOne userDaoTableOne;

  @Autowired
  private UserDaoTableTwo userDaoTableTwo;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    UserDetails user = userDaoTableOne.find(username);

    if(user == null){
        user = userDaoTableTwo.find(username);
    }

    if (user == null) {
        throw new UsernameNotFoundException(String.format("Username '%s' not found", username));
    }

    return user;
  }
}
 类似资料:
  • 我为spring-boot创建了一个spring安全配置类。我的登录页面有资源css、js和ico文件。这些资源由于安全原因而被拒绝,并且每次都被重定向到登录页面。为什么EnableWebMVCSecurity不添加类路径资源位置。在更改代码后,如第二个代码片段所示,将添加I Classpath资源位置。不明白第一段代码中的资源缺少什么。 我通过将代码更改为 在更改代码之后,我注意到忽略路径被添加

  • 我的spring boot应用程序有一个application类。当我(作为应用程序)运行它时,它会在嵌入式servlet容器(在我的例子中是Tomcat)中启动自己。以某种方式(我想是通过应用程序的@Annotations),加载了同一包中的WebSecurityConfig(扩展WebSecurityConfigurerAdapter)。 WebSecurityConfig包含两个重要的配置信

  • 然后我添加了一个SecurityConfig。从那时起,CorsFilter停止工作,我在angular应用程序中得到了一个异常: CORS策略阻止了从origin“http://localhost:8080/users/999/folders/%2f/media/”从“http://localhost:4200”访问“http://localhost:8080/users/999/folders

  • 我正在做一个测试项目,为我们未来的项目尝试SpringBoot。 我们正在使用jasig CAS,我正在尝试配置Spring Boot和嵌入式tomcat服务器。 所以我加入了pom。xml spring启动程序安全性 之后,我尝试配置WebSecurityConfig- 这里是第一个问题:类组织。springframework。安全中科院。网状物应用程序未重新确认CasAuthenticatio

  • 我正在使用Spring Security性,它工作正常,但现在我想手动启动安全过程,对客户端进行更改,我需要在我的控制器中获取用户名和密码(表单不会直接调用“j_spring_security_check”) 我想到了两个选项,我有一些问题: > 在我得到参数并做了一些事情之后,我将向j_spring_security_checkurl发送一个post请求。我的代码: 公共无效测试(loginDT

  • 我有一个使用Spring MVC编写的REST服务。该服务器是一个OAuth2资源服务器,我正在使用Jwt验证提供程序来解析JWT并将其转换为主体。这一切都很好。 然而,我真正想做的是使用JWT中声明提供的用户名从数据库加载用户详细信息。然后,新主体应该替换或(理想情况下)包装Jwt,以便它可以直接从SecurityContext获得。 我真的很难看到如何做到这一点。JwtAuthenticati