我希望应用程序将注册期间在用户注册屏幕上输入的用户作为参数提供给 API,该 API 由用户搜索帐户并找到,返回帐户激活状态(true/false)。
忽略流程,问题是...登录到应用程序,服务通过 swagger 正常工作并返回预期的内容,但是当我执行测试时通过邮递员,它仅在我提供不记名令牌时才有效,但我需要该 API 能够被未经身份验证的用户使用,而不仅仅是经过身份验证的用户。
.authorizeHttpRequests(
authz ->
// prettier-ignore
authz
.requestMatchers(mvc.pattern("/account/activated/**")).permitAll()
.requestMatchers(mvc.pattern("/account/activated/{login}")).permitAll()
同样,在我的 AccountResource.java 中,我插入了 @PermitAll 注释:
@PermitAll
@GetMapping("/account/activated/{login}")
public boolean getActivationStatusByLogin(@PathVariable String login) {
Optional<User> user = userRepository.findOneByLogin(login);
return user.map(User::isActivated).orElseThrow(() -> new AccountResourceException("User with login " + login + " not found"));
}
记住邮递员让我通过网址执行
http://localhost:8080/api/account/activated/string-do-login-consultado
例如 Postman,如果我添加不记名令牌,它的工作方式与我登录并使用应用程序的 swagger 测试 api 时的工作方式完全相同。
我还需要做什么才能公开这项服务,我已经测试了我所知道的一切,所以开发界的明智奇才,请帮助这个蚱蜢。
FooController
的新
/foo
,则必须在
SpaWebFilter
和
SecurityConfiguration
中允许它。例如:
package com.mycompany.myapp.web.rest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FooController {
@GetMapping("/foo")
public String foo(@RequestParam(value = "name", required = false) String name) {
return String.format("Hello %s", name != null ? name : "World");
}
}
SpaWebFilter.java:
public class SpaWebFilter extends OncePerRequestFilter {
/**
* Forwards any unmapped paths (except those containing a period) to the client {@code index.html}.
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// Request URI includes the contextPath if any, removed it.
String path = request.getRequestURI().substring(request.getContextPath().length());
if (
!path.startsWith("/foo") &&
!path.startsWith("/api") &&
!path.startsWith("/management") &&
!path.startsWith("/v3/api-docs") &&
!path.contains(".") &&
path.matches("/(.*)")
) {
request.getRequestDispatcher("/index.html").forward(request, response);
return;
}
filterChain.doFilter(request, response);
}
}
安全配置.java:
.requestMatchers(mvc.pattern("/foo")).permitAll()
如果要使用@PermitAll()
,则必须将
jsr250Enabled = true
添加到
@EnableMethodSecurity
。请参阅https://docs.spring.io/spring-security/reference/servlet/authorization/method-security.html#use-jsr250 了解更多信息。