1

を承認した私は、次の春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()から取得できません。

上記の方法でこのエンドポイントを設定するにはどうすればよいですか?

+1

すべて許可すると、すべてのユーザーがコントローラメソッドを呼び出すようにする必要があります。コード内で 'SecurityContextHolder.getContext()。getAuthentication()'を呼び出すと、何か間違ったことが起こりそうです。あなたが誰であるか知る必要があるならば、コントローラメソッドに 'Authentication auth'を含めるだけで、' Model'、 'Session'や他の種類のものと同様に、Springはあなたのためにそれを注入します。 –

答えて

2

私は解決策を見つけたと思う - 私は私のメソッドを注釈を付けています:任意のより良い解決策がある場合は私に知らせてください

@PreAuthorize("isAnonymous() or isFullyAuthenticated()") 

+1

はい、あなたは正しいです。私はビジネスロジックにこの問題の原因となった問題を発見しました。これで、すべてが 'permitAll'で完全に動作します。ありがとう。 – alexanoid

関連する問題