Java 简单的Spring安全性要求

Java 简单的Spring安全性要求,java,spring,spring-security,Java,Spring,Spring Security,我已经读了医生的报告 我不需要这里的角色,也不需要任何数据库。这份文件对我的要求太高了。我只想通过登录页面对用户进行身份验证。成功验证用户后,我将创建一个cookie。将检查所有即将到来的请求是否具有有效的cookie 我的想法是:将有一个过滤器检查每个即将到来的请求,如果cookie过期,则有一个入口点将用户重定向到登录页面 但我不知道如何将这些简单的需求与spring安全性结合起来。。。或者我应该使用其他东西吗?使用Spring安全性,只需最少的配置,就可以实现您想要的功能。 因为您不想在数

我已经读了医生的报告

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

我的想法是:将有一个过滤器检查每个即将到来的请求,如果cookie过期,则有一个入口点将用户重定向到登录页面


但我不知道如何将这些简单的需求与spring安全性结合起来。。。或者我应该使用其他东西吗?

使用Spring安全性,只需最少的配置,就可以实现您想要的功能。 因为您不想在数据库中存储用户凭据,所以可以将其以编码格式存储在配置中(尽管 由于安全原因,这是任何人都不应该向您建议的,但这是另一个话题) 您试图通过cookie执行的操作类似于Spring开箱即用提供的“记住我”功能。 要完成所有这些,您通常需要放置一个过滤器声明/映射和一个最小的配置文件,以及登录/注销页面,这样就完成了。 你可以看一个简单的例子。
如果以后您需要更多(您永远不知道:-),您已经有了一个坚如磐石的产品。

验证用户后,Spring security将在会话(cookie)上创建添加到SecurityContextHolder中的身份验证对象

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

  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);
}

如果您使用的是Java配置,那么Spring安全配置将如下所示:

@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安全性添加到Servlet筛选器链中

,以及如何进行身份验证?你在哪里储存你的用户?你需要一些东西来存储你的用户名/密码组合。您也不需要选择而不是要求的角色…@JobSmith您可以在项目中使用Spring Boot吗?如果是这样,你所要求的可以用更少的钱实现configuration@M.Deinum我将使用API来验证凭据。然后只需提供您自己的
UserDetailsService
AuthenticationProvider
,它将包装此API。@M.Deinum谢谢Deinum,我感到困惑。您能提供一个xml配置示例吗?再次感谢..谢谢Shailendra,实际上我不会将用户名/密码存储在任何地方。一旦我知道用户名/密码匹配(可能是api调用),我就会生成一个cookie。然后你可以很容易地将适当的UserDetailService插入到配置中。
@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);
    }
}