0

Spring Security Core Pluginを使用してGrailsアプリケーションを実行しています。GrailsのSpring Security Coreが、アクセスが拒否された理由に応じて別のページをレンダリングする方法

すでにログインしているユーザーがアクセス権なしでページにアクセスしようとすると、UrlMappings.groovy内で403として設定されたのと同じアクションが常に呼び出されます。

私は自分のアプリケーションがアクセス拒否の原因に応じて異なるページをレンダリングするために苦労してきました。例:IS_AUTHENTICATED_FULLYが必要な場合、ユーザーを再認証できるフォームにリダイレクトします。特定のロールが必要だが存在しない場合は、ユーザーをこのロールを要求できるページにリダイレクトする必要があります。それで...

アーカイブ方法を知っている人はいますか?

============================== UPDATE =============== ===================

私はこの問題を、コールバック(docs)で解決しようとしました。残念ながら、イベントパラメータは、それを引き起こしたルールに関係なく常に同一です。

少なくとも私はそこからのアクセスを拒否されたURIへのアクセス権を持っています。 URIからセキュリティルールを取得する方法があるので、現在のユーザーの役割とステータスを比較して何が欠落しているかを調べることができます。それはおそらく問題を解決するだろう。

答えて

1

、最終的にはそれが@yariashの応答とthis postからいくつかのアイデアで動作するようになった:

import org.springframework.context.ApplicationListener; 
import org.springframework.security.access.event.AuthorizationFailureEvent 
import org.springframework.security.authentication.RememberMeAuthenticationToken; 

class AuthorizationFailureEventListener 
     implements ApplicationListener<AuthorizationFailureEvent> { 

    @Override 
    public void onApplicationEvent(AuthorizationFailureEvent e) { 
     def attributes = e.getConfigAttributes() 

     if(!attributes) { 
      return 
     } 

     def authentication = e.getAuthentication() 
     def requiredAuthorities = attributes?.collect { it.getAttribute() } 
     def userAuthorities = authentication.getAuthorities().collect { it.getAuthority() } 
     def missingAuthorities = requiredAuthorities - userAuthorities 

     if(requiredAuthorities.contains('IS_AUTHENTICATED_FULLY') && 
       !(authentication instanceof RememberMeAuthenticationToken)) { 
      requiredAuthorities.remove('IS_AUTHENTICATED_FULLY') 
     } 

     e.getSource().getRequest().setAttribute("MISSING_AUTHORITIES", missingAuthorities); 
    } 

} 

その後Beanとしてこのlistennerを含めます

beans = { 
    //... 
    authorizationFailureEventListener(AuthorizationFailureEventListener) { bean -> 
     bean.autowire = "byName" 
    } 
    //... 
} 

最後にエラーコントローラで:

static mappings = { 
    //.... 
    "403"(controller:'error', action:'error403') 
    //...... 
} 

class ErrorController { 
    def error403() { 
     def missingAuthorities = request.getAttribute("MISSING_AUTHORITIES") 
     // Render the right view based on the missing authorities 
    } 
} 
+0

いい仕事です。あなたは自分の答えを受け入れることができます。 –

+0

ありがとうございます。ちょうどそれをした;) – ylima

1

コントローラとアクセス例外を作成することがありますか?インターネットを通じて、長い研究の後

static mappings = { 
    //.... 
    "403"(controller:'error', action:'error403') 
    //...... 
} 


class ErrorController { 
    def error403() { 
     def message = request.exception?.cause?.message; //access message and render right view 
    } 
} 
+0

お返事ありがとうございました。それを試してみました。残念ながら、例外は常にnullです。私は 'onAuthorizationEvent'コールバックでSpring Securityによってスローされた' AccessDeniedException'にアクセスしています。しかし、それを引き起こしたルールに関係なく同じです。私はより詳細な質問を編集します。 – ylima

関連する問題