2012-05-03 15 views
6

Tôi đang cố gắng bảo mật ứng dụng grails của mình với bảo mật mùa xuân dựa trên preAuth bởi Siteminder. Đó là cơ bản tất cả những gì tôi cần. Ứng dụng này chỉ được sử dụng để kiểm tra một số nội dung mà không cần cơ sở dữ liệu.Grails, Spring Security & Siteminder - sự cố với tài nguyên hoặc userDetails

Tôi bị kẹt trên một số vấn đề về bộ lọc mà tôi bằng cách nào đó không thể nắm lấy.

Lúc đầu, tôi chỉ sử dụng RequestHeaderAuthenticationFilter và UserDetails tùy chỉnh và UserDetailsService.

đậu mùa xuân của tôi:

beans = { 
    userDetailsService(MyUserDetailsService) 

    userDetailsServiceWrapper(UserDetailsByNameServiceWrapper) { 
      userDetailsService = ref('userDetailsService') 
    } 

    preauthAuthProvider(PreAuthenticatedAuthenticationProvider) { 
      preAuthenticatedUserDetailsService = ref('userDetailsServiceWrapper') 
    } 

    requestHeaderAuthenticationFilter(RequestHeaderAuthenticationFilter){ 
     principalRequestHeader='SM_USER' 
     authenticationManager = ref('authenticationManager') 
    } 
} 

Tôi có MyUserDetailsProvider tôi:

class MyUserDetailsService implements GrailsUserDetailsService { 

    MyUserDetails loadUserByUsername(String username) throws UsernameNotFoundException{ 

     //some super secret code here ;) 
     return new MyUserDetails(some needed params) 
    } 
} 

Tôi cũng cấu hình URL được bảo đảm như trong mọi hướng dẫn khôn ngoan:

grails.plugins.springsecurity.interceptUrlMap = [ 
    '/user/**':['ROLE_MINE'], 
    '/activation/**':['ROLE_SOMEOTHER, ROLE_MINE'], 
    '/js/**':  ['IS_AUTHENTICATED_ANONYMOUSLY'], 
    '/css/**':  ['IS_AUTHENTICATED_ANONYMOUSLY'], 
    '/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'], 
    '/*':   ['IS_AUTHENTICATED_ANONYMOUSLY'] 
] 

và một số nhà cung cấp (trái ẩn danh như được khuyên trong một số hướng dẫn):

grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider'] 

Nó hoạt động rất tốt để truy cập dữ liệu nhưng không cho phép tải tài nguyên, hình ảnh nói riêng. Lỗi nói rằng tiêu đề SM_USER không được tìm thấy theo yêu cầu. Vì vậy, tôi nghĩ rằng tôi có thể sử dụng một số giải pháp như 'bộ lọc: none' hoặc 'security: none' để mùa xuân sẽ biết yêu cầu url cho phép mà không kiểm tra SM_USER.

Tôi đã cố gắng bổ sung thêm công cụ để lọc và filterChain:

grails.plugins.springsecurity.filterNames = ['requestHeaderAuthenticationFilter'] 

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/user/**': 'requestHeaderAuthenticationFilter', 
    '/activation/**': 'requestHeaderAuthenticationFilter', 
    '/*': 'requestHeaderAuthenticationFilter' 
] 

nhưng nó đã không giúp đỡ.

Sau đó, tôi đã thử sử dụng một số bộ lọc khác để sử dụng trên các tài nguyên không có tiêu đề SM_USER. Từ tài liệu tham khảo, tôi hiểu rằng bộ lọc ẩn danh có thể là đủ.

Vì vậy, tôi thực hiện một số thay đổi:

grails.plugins.springsecurity.providerNames = ['preauthAuthProvider','anonymousAuthenticationProvider'] 

grails.plugins.springsecurity.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter'] 

grails.plugins.springsecurity.filterChain.filterNames = ['anonymousAuthenticationFilter','requestHeaderAuthenticationFilter' 

]

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/user/**': 'requestHeaderAuthenticationFilter', 
    '/versionone/**': 'requestHeaderAuthenticationFilter', 
    '/activation/**': 'requestHeaderAuthenticationFilter', 
    '/js/**': 'anonymousAuthenticationFilter', 
    '/css/**': 'anonymousAuthenticationFilter', 
    '/images/**': 'anonymousAuthenticationFilter', 
    '/*': 'requestHeaderAuthenticationFilter' 
] 

YAY đã giúp cho hình ảnh. Nhưng một vấn đề khác bắt đầu xảy ra.

Thay vì đối tượng myUserDetails cần được trả lại khi xác thực đúng, tôi nhận được một số đối tượng String khá thường xuyên. Và ứng dụng của tôi không hoạt động để tìm thấy một thuộc tính trong đối tượng String này (điều này khá rõ ràng vì nó không có ở đó;))

Có ai biết cách giải quyết vấn đề đó không? Từ chối hiển thị hình ảnh không phải là một lựa chọn;)

Có cách nào để loại trừ hình ảnh/tài nguyên khác khỏi bộ lọc trong cấu hình an ninh mùa xuân ...? Cũng giống như nó đã được thực hiện theo cách bình thường .xml Java ...?

Tôi sẽ đánh giá cao tất cả sự trợ giúp và đề xuất cách giải quyết vấn đề này.

Xin cảm ơn !!!

// EDIT: nếu bởi bất kỳ cơ hội bất cứ ai đang sử dụng điều này như một tài liệu tham khảo để thiết lập bảo mật cho SiteMinder sso xin lưu ý thêm:

checkForPrincipalChanges = 'true' 
invalidateSessionOnPrincipalChange = 'true' 

tính để requestHeaderAuthenticationFilter của bạn. Nếu không, bạn sẽ xử lý không được cập nhật Authority trong phiên http khi gọi springSecurityService.getPrincipal() do đó người dùng có thể được 'đăng nhập như một người khác'. :) Cũng xem xét việc thay đổi phạm vi đậu của bạn thành 'nguyên mẫu'.

Trả lời

2

Nếu có ai quan tâm - Tôi tìm thấy một số cách giải quyết cho vấn đề này:

1. Hỏi SiteMinder admin để thêm tiêu đề SM_USER cho tất cả các hình ảnh hoặc một số thiết lập trong số họ hạn chế đến vị trí url. Điều này bị tắt theo mặc định do hiệu suất chung. Sau đó, loại bỏ tất cả các bộ lọc bổ sung và sống hạnh phúc mãi mãi sau đó bằng bộ lọc trước.

2. Sử dụng nội dung tĩnh thay vì bao gồm cả hình ảnh trong .WAR và chuyển hướng:]

LÀM THẾ NÀO ĐỂ:

Đặt tất cả các hình ảnh cần thiết trong var/www/yourfolder/images Thêm một số bí danh để httpd cấu hình của bạn:

Alias /yourapp/imgs var/www/yourfolder/images 
ProxyPass /yourapp/imgs ! 

Khởi động lại dịch vụ của bạn Hãy vui lên bằng hình ảnh: D

Tôi biết rằng đây không phải là giải pháp mà chỉ giải quyết. Tuy nhiên, nó hoạt động. Tôi sẽ vẫn vui khi nghe một số ý tưởng hay hơn :)

Chúc mừng.