2011-08-15 26 views
6

Làm thế nào tôi có thể cấu hình ứng dụng Grails bằng cách sử dụng bảo mật Spring sao cho một tập hợp url sẽ chuyển hướng người dùng chưa được xác thực đến biểu mẫu đăng nhập tùy chỉnh với mã phản hồi http là 200, trong khi một tập hợp url khác đang triển khai dịch vụ web an toàn và phải trả về 401/không có phản hồi được ủy quyền cho khách hàng chưa được xác thực để ứng dụng khách có thể gửi lại yêu cầu bằng tên người dùng và mật khẩu theo 401.Cách định cấu hình lược đồ xác thực Grails/Spring cho mỗi url?

Cấu hình hiện tại của tôi có thể xử lý trường hợp đầu tiên với biểu mẫu đăng nhập tùy chỉnh. Tuy nhiên, tôi cần phải cấu hình loại xác thực khác cho url giao diện an toàn trong khi vẫn duy trì hành vi hiện tại cho giao diện con người.

Cảm ơn!

Trả lời

0

Tôi gặp vấn đề tương tự và không tìm thấy giải pháp tốt cho việc này. Tôi thực sự mong đợi một giải pháp sạch (một cái gì đó trong bối cảnh như nhiều người thuê).

Tôi đã kết thúc xác minh trạng thái và phần đăng nhập theo cách thủ công cho hệ thống thứ hai, không được chuyển hướng đến trang đăng nhập (vì vậy tôi không sử dụng chú thích "Bảo mật"). Tôi đã làm điều này bằng cách sử dụng springSecurityService.reauthenticate() (để đăng nhập theo cách thủ công), springSecurityService.isLoggedIn() và theo cách thủ công trong mỗi bộ điều khiển cho hệ thống thứ hai. Nếu không, tôi đã chuyển hướng đến trang cụ thể.

Tôi không biết, liệu công việc này có hợp lý cho hệ thống thứ hai của bạn hay không.

7

Nếu tôi hiểu đúng những gì bạn muốn làm, tôi đã gặp vấn đề tương tự, trước đây! nhưng thật dễ dàng để giải quyết nó bằng cách sử dụng Spring Security grails Plugin! Vì vậy, trước hết, bạn phải thiết lập ứng dụng của bạn để sử dụng xác thực cơ bản:

grails.plugins.springsecurity.useBasicAuth = true 

Vì vậy, dịch vụ yên tĩnh của bạn sẽ cố gắng đăng nhập, và nếu nó không làm việc nó đi đến 401! Điều này thật dễ dàng nhưng bạn cũng cần sử dụng biểu mẫu tùy chỉnh để đăng nhập ngay ?! Vì vậy, bạn chỉ có thể cấu hình một số URL để được vào chiến lược đăng nhập bình thường của bạn như thế này:

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

Vì vậy, chú ý, mà ở trên, tất cả những gì nói đến URL/api/sẽ sử dụng Auth cơ bản, nhưng bất cứ điều gì đó không phải là từ/api/sử dụng mẫu đăng nhập xác thực thông thường!

EDIT

Xem thêm thông tin đi vào http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

+0

Ngoài ra, hãy cẩn thận không để bị cắn bởi lỗi này, vì sợ rằng bạn lãng phí giờ cố gắng tìm ra lý do tại sao điều này không làm việc cho bạn: http://jira.grails.org/browse/GPSPRINGSECURITYCORE-210 – James

0

Bạn nên xác thực cơ bản không quốc tịch. Để làm điều đó, vui lòng thực hiện các thay đổi sau trong mã của bạn.
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.groovy

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) 
    } 
} 
Các vấn đề liên quan