gpt4 book ai didi

spring - 如何有单独的身份验证源? (一个用于 Oauth2,一个用于基于表单的登录)

转载 作者:行者123 更新时间:2023-12-04 12:46:48 25 4
gpt4 key购买 nike

我正在编写一个具有链接到数据库的身份验证的小型应用程序,此身份验证将由 Oauth2 方面(由@EnableAuthorizationServer 和@EnableResourceServer 注释的类)管理。在同一个应用程序中还有另一个用于管理页面的身份验证,该页面将链接到另一个不同的数据库,并将使用正常的基于表单的身份验证。

我为此特定目的编写了以下网络安全配置类:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig{

@Configuration
@Order(5)
public static class AdminSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {

http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/admin_logout"))
.invalidateHttpSession(true).logoutSuccessUrl("/admin/login.html");

http.authorizeRequests()
.antMatchers("/admin/login.html").permitAll().antMatchers("/admin/protected.html")
.hasRole("ADMIN")
.and().formLogin().loginPage("/admin/login.html")
.loginProcessingUrl("/admin_login").defaultSuccessUrl("/admin/protected.html");

}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
//Data source for form based auth
auth.inMemoryAuthentication().withUser("adminuser").password("adminpassword").roles("ADMIN");
}
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
//Data source for Oauth
auth.inMemoryAuthentication().withUser("myuser").password("mypassword").roles("USER").and().withUser("test")
.password("testpassword").roles("USER");
}
}

其他相关组件包括:

授权服务器配置:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter{

@Autowired
AuthenticationManager authenticationManager;

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager).tokenEnhancer(tokenEnhancer())
.tokenStore(tokenStore());
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("client")
.secret("secret")
.authorizedGrantTypes("password", "refresh_token")
.scopes("read", "write")
.resourceIds("resource").accessTokenValiditySeconds(60);
}

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception
{
oauthServer.checkTokenAccess("isAuthenticated()");
}

@Bean
public TokenEnhancer tokenEnhancer() {
return new CustomTokenEnhancer();
}

@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}

}

资源服务器配置:
@Configuration
@EnableResourceServer
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER-1)
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter{

@Autowired
TokenStore tokenStore;

@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.resourceId("resource").tokenStore(tokenStore);
}
@Override
public void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/api/**").authenticated();
}
}

您也可以在此处查看代码: https://github.com/cenobyte321/spring-oauth2-tokenenhancer-test/tree/webspeciallogin (分支:webspeciallogin)

问题是 AdminSecurityConfig 类中的所有内容都被忽略了,我可以在不登录的情况下进入 protected.html 页面,并且没有创建指定的登录和注销处理 url。

另一方面,基于 Oauth2 的登录可以正常工作。我还没有弄清楚如何在 Oauth2 中指定一个 AuthenticationManagerBuilder,大多数在线资源都建议使用 Oauth 适当读取的 configureGlobal 注入(inject)方法,这就是为什么它在上面的代码中设置的原因。

如何在一个启用 Oauth2 的应用程序中配置两个相互独立的身份验证源?

问候。

最佳答案

你需要两件事:

  • 确保您的 AdminSecurityConfig优先级高于您的 ResourceServerConfiguration .而@EnableResourceServer注释的文档说它将注册一个 WebSecurityConfigurerAdapter使用硬编码的 Order 3,它实际上在 ResourceServerOrderProcessor 中被覆盖顺序为 -10。因此,请确保您的 AdminSecurityConfig订单低于 -10。
  • 确保限制 HttpSecurity 的配置在 AdminSecurityConfig使用与您的管理服务器关联的 URL 的请求匹配器,如下所示:
    http.requestMatchers().antMatchers("/admin/**", "/admin_login", "/admin_logout")
    .and()
    .authorizeRequests()
    .antMatchers("/admin/protected.html").hasRole("ADMIN")
    .antMatchers("/admin/login.html").permitAll()
    .and()
    .formLogin().loginPage("/admin/login.html")
    .loginProcessingUrl("/admin_login")
    .defaultSuccessUrl("/admin/protected.html")
    .and()
    .logout().logoutRequestMatcher(new AntPathRequestMatcher("/admin_logout"))
    .invalidateHttpSession(true).logoutSuccessUrl("/admin/login.html")
    ;

    注意嵌入代码的第一行 http.requestMatchers().antMatchers("/admin/**", "/admin_login", "/admin_logout") .

  • 请参阅 Dave Syer(Spring Security 的作者之一) answer在一个类似的问题上供引用。

    我做了一个 pull request为您在 github 上的示例项目提供上述修复。

    关于spring - 如何有单独的身份验证源? (一个用于 Oauth2,一个用于基于表单的登录),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160584/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com