相关疑难解决方法(0)

使用Spring Security时,获取bean中当前用户名(即SecurityContext)信息的正确方法是什么?

我有一个使用Spring Security的Spring MVC Web应用程序.我想知道当前登录用户的用户名.我正在使用下面给出的代码段.这是接受的方式吗?

我不喜欢在这个控制器中调用静态方法 - 这违背了Spring的全部目的,恕我直言.有没有办法配置应用程序以注入当前的SecurityContext或当前的身份验证?

  @RequestMapping(method = RequestMethod.GET)
  public ModelAndView showResults(final HttpServletRequest request...) {
    final String currentUser = SecurityContextHolder.getContext().getAuthentication().getName();
    ...
  }
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-security

280
推荐指数
9
解决办法
17万
查看次数

Spring Boot Webflux Security - 编写测试时读取服务类中的主体

我对 Spring 生态系统和 Webflux 都很陌生。我试图弄清楚两件事,但找不到任何具体细节。

我的设置:

我正在使用 WebFlux 编写 Spring Boot 2 REST API(不使用控制器,而是使用处理程序函数)。身份验证服务器是一项单独的服务,它发出 JWT 令牌,并将这些令牌作为身份验证标头附加到每个请求。这是一个请求方法的简单示例:

public Mono<ServerResponse> all(ServerRequest serverRequest) {
        return principal(serverRequest).flatMap(principal ->
                ReactiveResponses.listResponse(this.projectService.all(principal)));
    }
Run Code Online (Sandbox Code Playgroud)

我用它来响应用户有权访问的所有“项目”列表的 GET 请求。

之后我有一个服务检索该用户的项目列表,并呈现一个 json 响应。

问题:

现在,为了根据当前用户 ID 过滤项目,我需要从请求主体中读取它。这里的一个问题是,我有很多需要当前用户信息的服务方法,并将其传递给服务似乎是一种矫枉过正。一种解决方案是从以下位置读取服务内的主体:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

问题一:

在编写功能代码时,这通常是一个很好的做法吗(如果我这样做而不是传播主体)?尽管在每种方法中读取主体并将其从请求发送到服务都很复杂,但这是否是一个好方法?

问题2:

我应该使用 SecurityContextHolder 线程本地来获取主体,如果我这样做,我该如何为我的服务编写测试?

如果我使用安全上下文,如何测试需要类型为主体的服务实现JWTAuthenticationToken JWT身份验证令牌

null当我尝试做类似此处描述的事情时,我总是会遇到这样的情况:使用 Spring Security 进行单元测试

在服务测试中,到目前为止,我在测试中所做的是将主体传播到服务方法并使用mockito 来模拟主体。这非常简单。在端点测试中,我@WithMockUser在执行请求时使用填充主体,并模拟服务层。这样做的缺点是主要类型不同。

这是我的服务层测试类的样子:

@DataMongoTest
@Import({ProjectServiceImpl.class})
class ProjectServiceImplTest extends BaseServiceTest {

    @Autowired
    ProjectServiceImpl projectService;

    @Autowired
    ProjectRepository projectRepository;

    @Mock
    Principal principal;

    @Mock
    Principal principal2;

    @BeforeEach
    void …
Run Code Online (Sandbox Code Playgroud)

spring-security spring-boot spring-security-oauth2 spring-webflux

3
推荐指数
1
解决办法
8553
查看次数