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