を承認した私は、次の春RestControllerがあります匿名のための春@RestController単一の方法と、ユーザー
@RestController
@RequestMapping("/v1.0/tenants")
public class TenantController {
@Autowired
private TenantService tenantService;
@RequestMapping(value = "/{tenantId}", method = RequestMethod.GET)
public TenantResponse findTenantById(@PathVariable @NotNull @DecimalMin("0") Long tenantId) {
Tenant tenant = tenantService.findTenantById(tenantId);
return new TenantResponse(tenant);
}
}
findTenantById
方法は、匿名と許可されたユーザによってアクセスされなければなりません。匿名ユーザーの場合、SecurityContextHolder.getContext().getAuthentication()
はNULLまたはAnonymousAuthenticationToken
を返す必要がありますが、認可された - 認証オブジェクトの場合。
私のアプリケーションでは、OAuth2 + JWTトークンでセキュリティモデルを実装しました。
この私の設定:
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.antMatcher("/v1.0/**").authorizeRequests()
.antMatchers("/v1.0/tenants/**").permitAll()
.anyRequest().authenticated()
.and()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(STATELESS);
// @formatter:on
}
また、セキュアなエンドポイントのために、私は必要なく、@PreAuthorize
注釈を適用していないfindTenantById
の場合は、私が以前に言ったように、私は匿名のためにこのエンドポイントへのアクセスを許可する必要があるため許可されたユーザー。エンドポイントのビジネスロジックの中で、私は、異なる条件に基づいて誰が進むことができるかを決めます。
今でもこのエンドポイントにaccessToken
を提供していますが、認証されたユーザーオブジェクトをSecurityContextHolder.getContext().getAuthentication()
から取得できません。
上記の方法でこのエンドポイントを設定するにはどうすればよいですか?
すべて許可すると、すべてのユーザーがコントローラメソッドを呼び出すようにする必要があります。コード内で 'SecurityContextHolder.getContext()。getAuthentication()'を呼び出すと、何か間違ったことが起こりそうです。あなたが誰であるか知る必要があるならば、コントローラメソッドに 'Authentication auth'を含めるだけで、' Model'、 'Session'や他の種類のものと同様に、Springはあなたのためにそれを注入します。 –