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

时间:2014-02-19 23:10:02

标签: java spring spring-mvc spring-security spring-social

我正在调查我的网络应用程序中的问题,其中管理员使用传统方法登录并使用用户名和密码以及常规用户注册并使用他们的Facebook帐户登录。

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

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

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

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

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

这是我的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());
    }
}

}

1 个答案:

答案 0 :(得分:1)

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

  1. 您无需为Facebook登录提供任何自定义表单。它由facebook本身提供。您可以使用ProviderSignInController(默认实现)

  2. 尝试在开始时使用spring security配置管理员登录。然后在facebook中混音。 loginPage方法自定义将处理POST登录请求的url,因此您的表单需要将其用作'action'参数。另请注意,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;
    }
    }