简单的Spring安全性要求

时间:2014-06-12 06:50:53

标签: java spring spring-security

我已阅读http://docs.spring.io/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-minimal

中的文档

我不需要在这里担任角色,而且我不需要任何数据库。这份文件对我的要求太多了。我只想通过登录页面对用户进行身份验证。用户成功通过身份验证后,我将创建一个cookie。将检查所有即将到来的请求是否具有有效的cookie。

我的想法:如果Cookie过期,将会有一个过滤器检查每个即将发出的请求,并且一个入口点会将用户重定向到登录页面。

但我不知道将这些简单的要求与弹簧安全性相结合......还是应该使用别的东西?

3 个答案:

答案 0 :(得分:1)

如果您使用的是Java Config,那么Spring Security Configuration将如下所示:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private YourSpecificProvider provider; //simply wraps your API calls

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/css/**", "/js/**", "/fonts/**", "/images/**").permitAll() //add whatever else needs to be served without authentication
                .anyRequest().authenticated();
        http
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(provider);
    }
}

通过该设置,Spring Security将自动处理添加cookie /检查cookie /重定向/等所需的所有步骤。 您当然必须在/login

提供登录页面

根据您使用Spring的方式,您需要将Spring Security添加到Servlet过滤器链

答案 1 :(得分:0)

使用最小配置的Spring Security可以实现您想要的功能。 由于您不希望将用户凭据存储在数据库中,因此您可以将其以编码格式存储在配置中(但是 这是因为安全原因没有人建议你的事情 - 但那是另一个话题) 你想通过cookie做的事情类似于Spring提供的“记住我”功能。 要做到这一切,您通常需要放置过滤器声明/映射和最小配置文件以及登录/注销页面,您就完成了。 您可以查看简单示例here。 如果以后你需要更多(你永远不会知道:-))你已经拥有坚如磐石的产品。

答案 2 :(得分:0)

Spring验证用户在会话(cookie)上创建添加到SecurityContextHolder中的Authentication对象后的安全性。

首先,您需要创建身份验证管理器

  public class RestAuthenticationProvider implements AuthenticationProvider {


   @Override
   public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    RestToken restToken = (RestToken) authentication;

    String key = restToken.getKey();
    String credentials = restToken.getCredentials();

    User user = //Here create the implementation of how to validate the user


    if(user == null){
        throw new BadCredentialsException("User does not exist");
    }
    authentication = getAuthenticatedUser(user);
    ((RestToken) authentication).setDetails(user);
    return authentication;
}


private Authentication getAuthenticatedUser(User user) {
    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority(user.getRole()));
    return new RestToken(user.getId(), user.getPassword(), authorities);
}

@Override
/*
    Determines if this class can support the token provided by the filter.
 */
public boolean supports(Class<?> authentication) {
    return RestToken.class.equals(authentication);
}

}

然后当您从页面收到登录时,调用该身份验证管理器并保存创建的身份验证对象。

               Authentication successfulAuthentication = authenticationManager.authenticate(authentication);
            SecurityContextHolder.getContext().setAuthentication(successfulAuthentication);