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'.