2017-07-02 35 views
0

私のアプリケーションには春のセキュリティが使用されています。ログインに成功した後も、バネは拒否されたページにリダイレクトします。ログインが成功した後、常にスプリングセキュリティがアクセスを拒否されました

は、これは私の設定ファイルである

<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/> 
<security:http auto-config="true" use-expressions="true"> 
    <security:intercept-url pattern="/" access="permitAll"/> 
    <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/> 

    <security:form-login default-target-url="/employees" 
         authentication-failure-url="/" always-use-default-target="true" 
         authentication-success-handler-ref="UrlAuthenticationSuccessHandler"/> 
</security:http> 

<beans:bean id="UrlAuthenticationSuccessHandler" 
      class="com.sowmith.security.UrlAuthenticationSuccessHandler" /> 

<security:authentication-manager erase-credentials="false"> 
    <security:authentication-provider> 
    <security:user-service> 
     <security:user name="sowmith" password="reddy" authorities="hasRole('ROLE_ADMIN')"/> 
    </security:user-service> 
    </security:authentication-provider> 
</security:authentication-manager> 

コントローラクラス

@RequestMapping(value="/") 
public String welcome(){ 
    return "welcome"; 
} 


@RequestMapping(value = "/employees", method = RequestMethod.GET) 
//@PreAuthorize("isAuthenticated()") 
public String listEmployee(Model model) { 
    model.addAttribute("employee", new Employee()); 
    model.addAttribute("listEmployee", employeeService.listEmployee()); 
    model.addAttribute("user", getPrincipal()); 
    return "employee"; 
} 

AuthenticationsuccessHandlerクラス

protected void handle(HttpServletRequest request,HttpServletResponse response, 
         Authentication authentication) throws IOException{ 

    String targetUrl = determineTargetUrl(authentication); 
    if(response.isCommitted()){ 
     log.debug("Response has already been committed. Unable to redirect to " + targetUrl); 
     return; 
    } 
    redirectStrategy.sendRedirect(request, response, targetUrl); 
} 


protected String determineTargetUrl(Authentication authentication){ 

    boolean permitAll = false; 
    boolean isAdmin = false; 
    Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); 
    for(GrantedAuthority grantedAuthority : authorities){ 
     if (grantedAuthority.getAuthority().equals("permitAll")) { 
      permitAll = true; 
     } else if (grantedAuthority.getAuthority().equals("hasRole('ROLE_ADMIN')")) { 
      isAdmin = true; 
     } 
    } 
    if (permitAll){ 
     return "/"; 
    } else if (isAdmin) { 
     return "/employees"; 
    } else { 
     throw new IllegalStateException(); 
    } 

では、ターゲットURLの方法を決定し、それは役割のためにチェックしにリダイレクトされますターゲットURL。コントローラには当たらない。

+0

にごAuthenticationSuccessHandlerクラスの役割を確認するの状態があなたのUrlAuthenticationSuccessHandlerクラス –

答えて

0

私は

else if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) 
+0

を共有する場合、変更後

<security:user name="sowmith" password="reddy" authorities="ROLE_ADMIN"/> 

このようなあなたの春のセキュリティxmlファイルの認証マネージャタグで管理者を指定します"hasRole(ROLE_ADMIN)"によってロールを既に指定している –

+0

xmlベースの設定では、hasRole式は、ユーザーの権限を指定するのと同じように、acc特定のURLパターンへの権利。私は是正するために立つ。それは、あなたが他のものでそれを除外して物事を複雑にしないように提案した理由です。 – Perry

関連する問題