【发布时间】:2015-11-13 03:53:21
【问题描述】:
我有球衣休息服务,我用它来为 AngularJS 应用程序提供数据。 我想让一些休息方法像这个模板下的所有方法一样安全(myapp/data/**)。 我有 Spring @Repository 类来获取用户的用户名和密码。 我怎样才能做到这一点?
我试着这样做:
@Configuration
@Order(2147483636)
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests()
.antMatchers("/rest/**", "/").permitAll().anyRequest()
.authenticated().and().csrf()
.csrfTokenRepository(csrfTokenRepository()).and()
.addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.userDetailsService(userService);
}
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
但是没有这个类是安全的。
我想要确保安全的其他方法之一的示例:
@Path("/rest")
public class RestService {
@GET
@Path("/getEntity")
@Produces("application/json")
public Response getEntity(@QueryParam("id") int entityId) {
Entity e = entityRepository.get(entityId);
if (e != null) {
Response.ok(ObjectUtils.toJson(entity), MediaType.APPLICATION_JSON).build();
}
return Response.serverError().entity("Entity + entityId + " not found").build();
}
【问题讨论】:
标签: java angularjs spring rest spring-security