2011-07-29 20 views
3

Webアプリケーションのユーザーは、ユーザーの詳細を変更できます。このページのURLは次のとおりです。Spring Security:ユーザーが自分の管理ページにアクセスできるようにする

springproject/usermanagement/edituserinfo/4 

ここで、「4」はユーザーIDです。

私のセキュリティコンテキストは、次のようになります。

<security:http auto-config="true" use-expressions="true"> 
    <security:intercept-url pattern="/usermanagement" access="isAuthenticated()" /> 
    <security:intercept-url pattern="/usermanagement/new" access="hasRole('ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/usermanagement/edit/*" access="hasRole('ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/usermanagement/edituserinfo/*" access="isAuthenticated()" /> 
</security:http> 

にはどうすればいいだけで、自分の「edituserinfo」ページにアクセスするユーザーを制限することができますか?例えば。ユーザID 1を持つユーザーのみがアクセスできます。@RequestMapping("/usermanagement/edituserinfo/{userid}")とあなたのコードでは、ログインを検証するように "springproject/usermanagement/edituserinfo/1" ではなく "springproject/usermanagement/edituserinfo/4"

+0

あなたは本当にURLにユーザーIDを渡す必要があります?理想的には、あなたのURLは 'springproject/usermanagement/edituserinfo'でなければなりません。 JavaコードのユーザーIDを 'SecurityContextHolder.getContext()。getAuthentication()。getPrincipal()'として取得し、それを使用してユーザーの詳細をロードする必要があります。これにより、ユーザーは自分の詳細しか表示できず、ほかの誰も見ることができなくなります。 – manish

答えて

3

は、URLにPathVariableを使用しますユーザのSpringセキュリティコンテキストの原則(SecurityContextHolder.getContext().getAuthentication().getPrincipal()経由)をuseridパス変数と照合します。一致しない場合は、ユーザーをバウンスさせてSecurityExceptionを記録し、管理者にメールを送信してください。

1

また、式をサポート春のセキュリティの@PreAuthorizeを使ってこれを実現することができます

@PreAuthorize("#userId == principal.id") 
public void doSomething(@PathVariable String userId); 

は春のドキュメントを参照してください:

Access Control using @PreAuthorize and @PostAuthorize

関連する問題