我正在使用无状态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它意味着每个经过身份验证的用户,但是你禁用了匿名访问,因此将无法使用。
permitAll
你想要的是忽略某些URL,从而覆盖configure采用WebSecurity对象和ignore模式的方法。
configure
WebSecurity
ignore
@Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/api/v1/signup"); }
然后从HttpSecurity零件中删除该线。这将告诉Spring Security忽略该URL,并且不对其应用任何过滤器。
HttpSecurity