2011-12-05 2 views
2

私はRESTサービスとスプリングセキュリティで動作するアプリケーションを持っています。私はBasic認証を持っており、ハードとソフトのログインが必要です。Spring Security:認証されたユーザーに余分な役割を追加する方法

シナリオ:ユーザがログインすると、ROLE_SOFT が割り当てられ、ROLE_SOFTを必要とするURLにアクセスできますが、ROLE_HARDが必要なURLにアクセスしたい場合は、指定されたWebサービス。

それは私が作成した後、だから私はこの Acegi Security: How do i add another GrantedAuthority to Authentication to anonymous user

をお読みください。

public class AuthenticationWrapper implements Authentication 
{ 
    private Authentication original; 

    public AuthenticationWrapper(Authentication original) 
    { 
     this.original = original; 
    } 


    public String getName() { return original.getName(); } 
    public Object getCredentials() { return original.getCredentials(); } 
    public Object getDetails() { return original.getDetails(); } 
    public Object getPrincipal() { return original.getPrincipal(); } 
    public boolean isAuthenticated() { return original.isAuthenticated(); } 
    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException 
    { 
     original.setAuthenticated(isAuthenticated); 
    } 

public Collection<? extends GrantedAuthority> getAuthorities() { 
    System.out.println("EXISTING ROLES:"); 
    System.out.println("Size=:"+original.getAuthorities().size()); 
    for (GrantedAuthority iterable : original.getAuthorities()) { 

     System.out.println(iterable.getAuthority()); 
    } 

    GrantedAuthority newrole = new SimpleGrantedAuthority("ROLE_HARD"); 
    System.out.println("ADD new ROLE:"+newrole.getAuthority()); 
    Collection<? extends GrantedAuthority> originalRoles = original.getAuthorities(); 

    ArrayList<GrantedAuthority> temp = new ArrayList<GrantedAuthority>(originalRoles.size()+1); 
    temp.addAll(originalRoles); 
    temp.add(newrole); 
    System.out.println("RETURN NEW LIST SIZE"+temp.size()); 
    for (GrantedAuthority grantedAuthority : temp) { 
     System.out.println("NEW ROLES:"+grantedAuthority.getAuthority()); 
    } 

    return Collections.unmodifiableList(temp); 
} 

とコントローラ

@Controller 
@RequestMapping("/login") 
public class LoginControllerImpl implements LoginController { 


    LoginService loginService; 


    @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json") 
    @ResponseBody 
    public User getUserSettings(){ 
     loginService=new LoginServiceImpl(); 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
     AuthenticationWrapper wrapper = new AuthenticationWrapper(auth); 
     SecurityContextHolder.getContext().setAuthentication(wrapper); 

     return loginService.getUser(); 
    } 


} 

をしかし、私は、私のセッションがダウンした認証に変更した後、多分いくつかの.. を1つはより良い解決策を知っています...

答えて

0

ちょっとしたアイデア..ユーザーが初めてログインフォームを使用してログインし、リソースにアクセスする必要がある場合は、追加の権限が必要です。なぜユーザーを再度ログインページにリダイレクトしないのですか?

<http auto-config="true" use-expressions="true"> 
       <intercept-url pattern="/resources/**" access="denyAll"/> 
       <intercept-url pattern="/login.do" access="permitAll"/> 
       <intercept-url pattern="/role_soft_url_domain/* " access="hasRole('ROLE_SOFT') and fullyAuthenticated"/> 
       <intercept-url pattern="/role_hard_url_domain/*" access="hasRole('ROLE_HARD') and fullyAuthenticated"/>    
       <intercept-url pattern="/*" access="hasRole('ROLE_SOFT')"/> 
       <form-login login-page="/login.do" />    
       <logout invalidate-session="true" 
        logout-success-url="/" 
        logout-url="/j_spring_security_logout"/> 
       </http> 
関連する問題