gpt4 book ai didi

java - 不同登录页面中的 Spring Security 和 Spring Social

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:31 24 4
gpt4 key购买 nike

我对我的网络应用程序中存在的一个问题进行了很长时间的调查,其中管理员使用用户名和密码的传统方法进行注册和登录,而普通用户则使用他们的 Facebook 帐户进行注册和登录。

两个登录表单位于不同的页面;但是,我希望这两个应用程序基于相同的 Spring Security。

我有几个与此相关的问题:

1)我想在登陆页面中设置用户社交登录表单,而其他页面则在不同页面中设置。为此,我按如下方式配置了 HttpRequest,但登录页面未启动。

2) 我是否应该配置两个 HttpSecurity,一个用于传统登录,一个用于社交登录? (当前配置不起作用)

3) 我想定义两个权限,一个用于管理员 ROLE_ADMIN,另一个用于普通用户 ROLE_USER。如何为使用 soaicl 帐户登录的用户定义角色?

这是我的 HttpSecurity 配置

@Configuration
@EnableWebSecurity
public class SecurityConfig{

@Autowired
private ApplicationContext context;

@Autowired
private DataSource dataSource;

@Autowired
public void registerAuthentication(AuthenticationManagerBuilder auth)
throws Exception {

auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery(
"select username, password, enabled from Account where username = ?")
.authoritiesByUsernameQuery(
"select username, authority from Account where username = ?")
.passwordEncoder(passwordEncoder());

}


@Bean
public UserIdSource userIdSource() {
return new AuthenticationNameUserIdSource();
}

@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}

@Bean
public TextEncryptor textEncryptor() {
return Encryptors.noOpText();
}

@Configuration
@Order(2)
public static class BizSecurityConfigurationAdapter extends
WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginPage("/admin")
.loginProcessingUrl("/admin/authenticate")
.failureUrl("/admin?param.error=bad_credentials")
.defaultSuccessUrl("/admin/home")
.and()
.authorizeRequests()
.antMatchers("/","/admin", "/resources/**",
"/auth/**", "/signin/**", "/signup/**", "/disconnect/**").permitAll()
.antMatchers("/**").authenticated()
.antMatchers("/**").hasRole("ADMIN")
.and()
.rememberMe();
}

@Bean
public SocialUserDetailsService socialUsersDetailService() {
return new SimpleSocialUsersDetailService(userDetailsService());
}
}

@Configuration
@Order(1)
public static class UserSecurityConfigurerAdapter extends
WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/")
.loginProcessingUrl("/authenticate")
.failureUrl("/?param.error=bad_credentials")
.defaultSuccessUrl("/user/profile")
.permitAll()
.and()
.logout()
.logoutUrl("/")
.deleteCookies("JSESSIONID")
.and()
.authorizeRequests()
.antMatchers("/", "/user","/admin","/login", "/admin/**",
"/resources/**", "/auth/**", "/signin/**",
"/signup/**", "/disconnect/**").permitAll()
.antMatchers("/user/**").hasRole("USER").and().rememberMe()
.and().apply(new SpringSocialConfigurer());
}

@Bean
public SocialUserDetailsService socialUsersDetailService() {
return new SimpleSocialUsersDetailService(userDetailsService());
}
}

}

最佳答案

似乎你正在混合一些 spring security/openid/oauth - spring 社交概念。

  1. 您不必为 Facebook 登录提供任何自定义表单。它是由facebook自己提供的。您可以使用ProviderSignInController(默认实现)

  2. 一开始尝试使用 spring security 配置管理员登录。然后在 Facebook 上混音。LoginPage 方法自定义 url 将处理登录的 POST 请求,因此您的表单需要将其用作“操作”参数。另请记住,Spring Security 3.2 默认情况下打开了 CSRF,因此您还必须通过隐藏输入来传递它。

  3. ProviderSignInController 使用 SimpleSignInAdapter 来处理登录。您可以在其 SignIn 方法中设置角色,并以编程方式在 Spring Security 中登录 facebook 用户。类似于:

    private class SimpleSignInAdapter implements SignInAdapter {
    public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
    UserProfile userProfile = connection.fetchUserProfile();
    User user = userRepository.findByUsername(userProfile.getEmail());
    Collection<GrantedAuthority> authorities = new ArrayList<>();
    authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
    Authentication auth = new UsernamePasswordAuthenticationToken(user, null, authorities);
    SecurityContextHolder.getContext().setAuthentication(auth);
    return null;
    }
    }

关于java - 不同登录页面中的 Spring Security 和 Spring Social,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894600/

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