如何禁用特定URL的Spring Security

我正在使用无状态Spring Security,但是如果要注册,我想禁用Spring Security。我禁用了

antMatchers("/api/v1/signup").permitAll().

但它不起作用,我在下面收到错误消息:

 message=An Authentication object was not found in the SecurityContext, type=org.springframework.security.authentication.AuthenticationCredentialsNotFoundException

我认为这意味着弹簧安全过滤器正在工作

我的网址顺序始终为“ / api / v1”

我的spring配置是

@Override

protected void configure(HttpSecurity http) throws Exception {

http.

csrf().disable().

sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).

and().

authorizeRequests().

antMatchers("/api/v1/signup").permitAll().

anyRequest().authenticated().

and().

anonymous().disable();

http.addFilterBefore(new AuthenticationFilter(authenticationManager()), BasicAuthenticationFilter.class);

}

我的身份验证过滤器是

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

HttpServletRequest httpRequest = asHttp(request);

HttpServletResponse httpResponse = asHttp(response);

String username = httpRequest.getHeader("X-Auth-Username");

String password = httpRequest.getHeader("X-Auth-Password");

String token = httpRequest.getHeader("X-Auth-Token");

String resourcePath = new UrlPathHelper().getPathWithinApplication(httpRequest);

try {

if (postToAuthenticate(httpRequest, resourcePath)) {

processUsernamePasswordAuthentication(httpResponse, username, password);

return;

}

if(token != null){

processTokenAuthentication(token);

}

chain.doFilter(request, response);

} catch (InternalAuthenticationServiceException internalAuthenticationServiceException) {

SecurityContextHolder.clearContext();

logger.error("Internal authentication service exception", internalAuthenticationServiceException);

httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

} catch (AuthenticationException authenticationException) {

SecurityContextHolder.clearContext();

httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, authenticationException.getMessage());

} finally {

}

}

private HttpServletRequest asHttp(ServletRequest request) {

return (HttpServletRequest) request;

}

private HttpServletResponse asHttp(ServletResponse response) {

return (HttpServletResponse) response;

}

private boolean postToAuthenticate(HttpServletRequest httpRequest, String resourcePath) {

return Constant.AUTHENTICATE_URL.equalsIgnoreCase(resourcePath) && httpRequest.getMethod().equals("POST");

}

private void processUsernamePasswordAuthentication(HttpServletResponse httpResponse,String username, String password) throws IOException {

Authentication resultOfAuthentication = tryToAuthenticateWithUsernameAndPassword(username, password);

SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication);

httpResponse.setStatus(HttpServletResponse.SC_OK);

httpResponse.addHeader("Content-Type", "application/json");

httpResponse.addHeader("X-Auth-Token", resultOfAuthentication.getDetails().toString());

}

private Authentication tryToAuthenticateWithUsernameAndPassword(String username,String password) {

UsernamePasswordAuthenticationToken requestAuthentication = new UsernamePasswordAuthenticationToken(username, password);

return tryToAuthenticate(requestAuthentication);

}

private void processTokenAuthentication(String token) {

Authentication resultOfAuthentication = tryToAuthenticateWithToken(token);

SecurityContextHolder.getContext().setAuthentication(resultOfAuthentication);

}

private Authentication tryToAuthenticateWithToken(String token) {

PreAuthenticatedAuthenticationToken requestAuthentication = new PreAuthenticatedAuthenticationToken(token, null);

return tryToAuthenticate(requestAuthentication);

}

private Authentication tryToAuthenticate(Authentication requestAuthentication) {

Authentication responseAuthentication = authenticationManager.authenticate(requestAuthentication);

if (responseAuthentication == null || !responseAuthentication.isAuthenticated()) {

throw new InternalAuthenticationServiceException("Unable to authenticate Domain User for provided credentials");

}

logger.debug("User successfully authenticated");

return responseAuthentication;

}

我的控制器是

@RestController

public class UserController {

@Autowired

UserService userService;

/**

* to pass user info to service

*/

@RequestMapping(value = "api/v1/signup",method = RequestMethod.POST)

public String saveUser(@RequestBody User user) {

userService.saveUser(user);

return "User registerted successfully";

}

}

我怎么做?

回答:

使用permitAll它意味着每个经过身份验证的用户,但是你禁用了匿名访问,因此将无法使用。

你想要的是忽略某些URL,从而覆盖configure采用WebSecurity对象和ignore模式的方法。

@Override

public void configure(WebSecurity web) throws Exception {

web.ignoring().antMatchers("/api/v1/signup");

}

然后从HttpSecurity零件中删除该线。这将告诉Spring Security忽略该URL,并且不对其应用任何过滤器。

以上是 如何禁用特定URL的Spring Security 的全部内容, 来源链接: utcz.com/qa/429514.html

回到顶部