我知道保护REST API是一个被广泛评论的话题,但是我无法创建一个符合我的标准的小型原型(并且我需要确认这些标准是现实的)。如何保护资源以及如何使用Spring安全性有很多选择,我需要弄清楚我的需求是否现实。
我的要求
当前状态
我的REST API运作良好,但现在我需要保护它。当我寻找解决方案时,我创建了一个javax.servlet.Filter
过滤器:
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String accessToken = request.getHeader(AUTHORIZATION_TOKEN);
Account account = accountDao.find(accessToken);
if (account == null) {
throw new UnauthorizedException();
}
chain.doFilter(req, res);
}
但是这种解决方案javax.servlet.filters
无法按我的需要工作,因为通过@ControllerAdvice
Spring 处理异常存在问题servlet dispatcher
。
我需要的
我想知道这些标准是否切合实际并获得任何帮助,以及如何开始使用Spring Security保护REST API。我阅读了许多教程(例如Spring Data REST + Spring Security),但是所有教程都在非常基本的配置中工作-带有凭据的用户存储在配置中的内存中,我需要使用DBMS并创建自己的身份验证器。
请给我一些想法,如何开始。
基于令牌的身份验证-用户将提供其凭据,并获得唯一且受时间限制的访问令牌。我想在自己的实现中管理令牌的创建,检查有效性和到期时间。
实际上,将过滤器用于令牌验证-这种情况下的最佳方法
最终,您可以通过Spring Data创建CRUD,以管理Token的属性(例如过期)等。
这是我的令牌过滤器:http : //pastebin.com/13WWpLq2
和令牌服务实施
某些REST资源将是公共的-完全不需要身份验证
没问题,您可以通过Spring安全配置来管理资源,如下所示: .antMatchers("/rest/blabla/**").permitAll()
某些资源仅对具有管理员权限的用户可用,
看一下@Secured
注解类。例:
@Controller
@RequestMapping(value = "/adminservice")
@Secured("ROLE_ADMIN")
public class AdminServiceController {
授权所有用户后,即可访问其他资源。
返回Spring Security configure,您可以像这样配置URL:
http
.authorizeRequests()
.antMatchers("/openforall/**").permitAll()
.antMatchers("/alsoopen/**").permitAll()
.anyRequest().authenticated()
我不想使用基本身份验证
是的,通过令牌过滤器,您的用户将通过身份验证。
Java代码配置(非XML)
回到上面的话,看@EnableWebSecurity
。您的课程将是:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {}
您必须重写configure方法。下面的代码仅作为示例,介绍如何配置匹配器。它来自另一个项目。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/assets/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.usernameParameter("j_username")
.passwordParameter("j_password")
.loginPage("/login")
.defaultSuccessUrl("/", true)
.successHandler(customAuthenticationSuccessHandler)
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.invalidateHttpSession(true)
.logoutSuccessUrl("/")
.deleteCookies("JSESSIONID")
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.and()
.csrf();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句