Java 将 Spring Security 与 SiteMinder 集成
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22952047/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Integrating Spring Security with SiteMinder
提问by user2601995
How do you integrate Spring Security with SiteMinder to receive a User and Role?
您如何将 Spring Security 与 SiteMinder 集成以接收用户和角色?
I have a project setup with Spring Security 'in-memory' and I want to use convert it to accept SiteMinder header with User and Roles. If SiteMinder will send the role of the user (ROLE_READ,ROLE_WRITE) and have the Service layer grant access. How do you convert the in-memory to use SiteMinder?
我有一个使用 Spring Security 'in-memory' 的项目设置,我想使用转换它来接受带有用户和角色的 SiteMinder 标头。如果 SiteMinder 将发送用户的角色 (ROLE_READ,ROLE_WRITE) 并让服务层授予访问权限。如何将内存转换为使用 SiteMinder?
In-Memory User Roles
内存中用户角色
List of users and roles for in-memory
内存中的用户和角色列表
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_READ" />
<user name="admin" password="admin" authorities="ROLE_READ,ROLE_WRITE" />
</user-service>
</authentication-provider>
</authentication-manager>
Service Layer Protection
服务层保护
Here the service methods are protected with specific roles
这里的服务方法受到特定角色的保护
<beans:bean id="testService" class="com.stackoverflow.test" scope="request">
<security:intercept-methods>
<security:protect access="ROLE_WRITE" method="do*"/>
<security:protect access="ROLE_READ" method="find*"/>
</security:intercept-methods>
</beans:bean>
This source (Spring Security Java Config for Siteminder) looks promising but its always assigned role RoleEmployee.
这个源(用于 Siteminder 的 Spring Security Java Config)看起来很有希望,但它总是分配角色 RoleEmployee。
采纳答案by user2601995
There is Spring Security for SiteMinder that exists to receive a User only. However, to receive a Role you'll need to create an extended authentication process. This will authenticate a user using a role.
SiteMinder 的 Spring Security 仅用于接收用户。但是,要接收角色,您需要创建扩展身份验证过程。这将使用角色对用户进行身份验证。
Within the root-security.xml
内 root-security.xml
<beans:bean id="userDetailsService" class="test.sm.SiteMinderUserDetailsService"/>
<beans:bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService">
<beans:bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<beans:property name="userDetailsService" ref="userDetailsService" />
</beans:bean>
</beans:property>
</beans:bean>
<beans:bean id="siteminderFilter" class="test.sm.SiteMinderFilter">
<beans:property name="principalRequestHeader" value="SM_USER" />
<beans:property name="rolesRequestHeader" value="SM_ROLE" />
<beans:property name="rolesDelimiter" value="," />
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="preauthAuthProvider" />
</authentication-manager>
SiteMinderUserDetailsService
SiteMinderUserDetailsService
public class SiteMinderUserDetailsService extends PreAuthenticatedGrantedAuthoritiesUserDetailsService implements
UserDetailsService {
@Override
public UserDetails loadUserByUsername(String arg0) throws UsernameNotFoundException {
SiteMinderUserDetails userDetails = new SiteMinderUserDetails();
userDetails.setUsername(arg0);
return userDetails;
}
@Override
protected UserDetails createuserDetails(Authentication token, Collection<? extends GrantedAuthority> authorities) {
return super.createuserDetails(token, authorities);
}
}
SiteMinderUserDetails
SiteMinder 用户详细信息
public class SiteMinderUserDetails implements UserDetails {
// implement all methods
}
SiteMinderFilter
站点管理器过滤器
public class SiteMinderFilter extends RequestHeaderAuthenticationFilter {
private String rolesRequestHeader;
private String rolesDelimiter;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException, NullPointerException {
String roles = (String) ((HttpServletRequest)request).getHeader(getRolesRequestHeader());
String[] rolesArray = roles.split(rolesDelimiter);
Collection<SimpleGrantedAuthority> auth = new ArrayList<SimpleGrantedAuthority>();
for (String s : rolesArray) {
auth.add(new SimpleGrantedAuthority(s));
}
SiteMinderUserDetails userDetails = new SiteMinderUserDetails();
userDetails.setUsername((String) super.getPreAuthenticatedPrincipal(((HttpServletRequest)request)));
userDetails.setAuthorities(auth);
AuthenticationImpl authentication = new AuthenticationImpl();
authentication.setAuthenticated(true);
authentication.setAuthorities(auth);
authentication.setPrincipal(userDetails);
authentication.setCredentials(super.getPreAuthenticatedCredentials(((HttpServletRequest)request)));
SecurityContextHolder.getContext().setAuthentication(authentication);
super.doFilter(request, response, chain);
}
public SiteMinderFilter() {
super();
}
@Override
public void setPrincipalRequestHeader(String principalRequestHeader) {
super.setPrincipalRequestHeader(principalRequestHeader);
}
public void setRolesRequestHeader(String rolesRequestHeader) {
this.rolesRequestHeader = rolesRequestHeader;
}
public String getRolesRequestHeader() {
return rolesRequestHeader;
}
public void setRolesDelimiter(String rolesDelimiter) {
this.rolesDelimiter = rolesDelimiter;
}
public String getRolesDelimiter() {
return rolesDelimiter;
}
}
AuthenticationImpl
身份验证实现
public class AuthenticationImpl implements Authentication {
// implement all methods
}