2011-08-15 4 views
6

Springセキュリティを使用してgrailsアプリケーションを設定するには、どのようにしてurlがunauthenticatedユーザをHTTPレスポンスコード200のカスタムログインフォームにリダイレクトし、別のURLセットが安らかなWebサービスを実装し、401認証されていないクライアントに対しては許可されていない応答が返されるため、クライアントアプリケーションは401に対応したユーザ名とパスワードでリクエストを再送信できます。URLごとにgrails/spring認証方式を設定するには?

私の現在の設定では、しかし、ヒューマンインタフェースの現在の動作を維持しながら、安らかなインタフェースURLのための他のタイプの認証を設定する必要があります。

ありがとうございます!

答えて

0

私は同じ問題を抱えていましたが、これには良い解決策が見つかりませんでした。私は本当にクリーンなソリューション(マルチテナントのようなコンテキストのもの)を楽しみにしています。

2番目のシステムのステータスとログイン部分を手動で確認しましたが、これはログインページにリダイレクトしないでください(「セキュリティ保護された」注釈を使用していないため)。私はspringSecurityService.reauthenticate()(手動ログイン用)、springSecurityService.isLoggedIn()を使用し、2番目のシステムの各コントローラーで手動でこれを行いました。彼がいない場合、私は特定のページにリダイレクトしています。

この回避策がお使いの2番目のシステムに適しているかどうかはわかりません。

7

私があなたがしたいことを正しく理解していれば、前と同じ問題があります。 Spring Security grails Pluginを使用して解決するのは簡単です!だからあなたのRESTfulサービスがログインしようとすると、それが401に行く仕事doesntの場合

grails.plugins.springsecurity.useBasicAuth = true 

:だから、すべての最初の、あなたは基本認証を使用するようにアプリケーションを設定する必要があります! これは簡単ですが、ログインにはカスタムフォームを使用する必要があります。だから、あなただけのためにいくつかのURLを設定できるのは、このようなあなたの通常のログイン戦略になる:

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter', 
    '/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter' 
] 

したがって、上記の、URL/APIに来るすべてのものは/基本認証を使用することに、注目されないが、何もfrom/api /は、通常の認証ログインフォームを使用します。

EDIT

詳しい情報は、あなたがステートレス基本認証を行う必要がありますhttp://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

+0

また、あなたはこれがあなたのために動作しない理由を把握しようと時間を無駄にしないように、このバグにかまを取得しないように注意してください:のhttp:/ /jira.grails.org/browse/GPSPRINGSECURITYCORE-210 – James

0

に行きます。そのためには、コードに以下の変更を加えてください。
UrlMappings.groovy

"/api/restLogin"(controller: 'api', action: 'restLogin', parseRequest: true) 

Config.groovy

grails.plugin.springsecurity.useBasicAuth = true 
grails.plugin.springsecurity.basic.realmName = "Login to My Site" 
    grails.plugin.springsecurity.filterChain.chainMap = [ 
       '*'   : 'statelessSecurityContextPersistenceFilter,logoutFilter,authenticationProcessingFilter,customBasicAuthenticationFilter,securityContextHolderAwareRequestFilter,rememberMeAuthenticationFilter,anonymousAuthenticationFilter,basicExceptionTranslationFilter,filterInvocationInterceptor', 
       '/api/': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter' 
     ] 

resources.groovy

statelessSecurityContextRepository(NullSecurityContextRepository) {} 

    statelessSecurityContextPersistenceFilter(SecurityContextPersistenceFilter, ref('statelessSecurityContextRepository')) { 
    } 
    customBasicAuthenticationEntryPoint(CustomBasicAuthenticationEntryPoint) { 
     realmName = SpringSecurityUtils.securityConfig.basic.realmName 
    } 

    customBasicAuthenticationFilter(BasicAuthenticationFilter, ref('authenticationManager'), ref('customBasicAuthenticationEntryPoint')) { 
     authenticationDetailsSource = ref('authenticationDetailsSource') 
     rememberMeServices = ref('rememberMeServices') 
     credentialsCharset = SpringSecurityUtils.securityConfig.basic.credentialsCharset // 'UTF-8' 
    } 

    basicAccessDeniedHandler(AccessDeniedHandlerImpl) 

    basicRequestCache(NullRequestCache) 

    basicExceptionTranslationFilter(ExceptionTranslationFilter, ref('customBasicAuthenticationEntryPoint'), ref('basicRequestCache')) { 
     accessDeniedHandler = ref('basicAccessDeniedHandler') 
     authenticationTrustResolver = ref('authenticationTrustResolver') 
     throwableAnalyzer = ref('throwableAnalyzer') 
    } 

CustomBasicAuthenticationEntryPoint。グルーヴィー

public class CustomBasicAuthenticationEntryPoint extends 
     BasicAuthenticationEntryPoint { 

    @Override 
    public void commence(HttpServletRequest request, 
         HttpServletResponse response, AuthenticationException authException) 
      throws IOException, ServletException {    
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } 

} 

ApiController

@Secured('permitAll') 
class ApiController { 
def springSecurityService 
@Secured("ROLE_USER") 
    def restLogin() {   
     User currentUser = springSecurityService.currentUser 
     println(currentUser.username) 
    } 
} 
関連する問題