gpt4 book ai didi

spring - 使用 spring security 3.1 对事件目录进行身份验证时处理角色

转载 作者:IT老高 更新时间:2023-10-28 13:52:52 27 4
gpt4 key购买 nike

我正在尝试使用 Spring Security 3.1 对 Active Directory 进行身份验证。我通过了身份验证,一切都很好。

<sec:ldap-server id="ldapServer" url="ldap://ldap/dc=sub,dc=domain,dc=com" port="389" />

<sec:authentication-manager erase-credentials="true" >
<sec:authentication-provider ref="ldapActiveDirectoryAuthProvider" />
</sec:authentication-manager>

<bean id="ldapActiveDirectoryAuthProvider"
class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
<constructor-arg value="domain" />
<constructor-arg value="ldap://server:389/"/>
</bean>

现在回答问题。如何处理用户的角色以便我可以设置过滤器?

例如。

<sec:intercept-url pattern="/**" access="ROLE_USER"/>

解决方案

我发现了如何使用 UserDetailContextMapper 并将我的 AD 组映射到 ROLE_USER、ROLE_ADMIN 等。

    <bean id="ldapActiveDirectoryAuthProvider" 
class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
<constructor-arg value="domain" />
<constructor-arg value="ldap://host:389/"/>
<property name="userDetailsContextMapper" ref="tdrUserDetailsContextMapper"/>
<property name="useAuthenticationRequestCredentials" value="true"/>
</bean>

<bean id="tdrUserDetailsContextMapper" class="com.bla.bla.UserDetailsContextMapperImpl"/>

映射器类:

public class UserDetailsContextMapperImpl implements UserDetailsContextMapper, Serializable{
private static final long serialVersionUID = 3962976258168853954L;

@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authority) {

List<GrantedAuthority> mappedAuthorities = new ArrayList<GrantedAuthority>();


for (GrantedAuthority granted : authority) {

if (granted.getAuthority().equalsIgnoreCase("MY USER GROUP")) {
mappedAuthorities.add(new GrantedAuthority(){
private static final long serialVersionUID = 4356967414267942910L;

@Override
public String getAuthority() {
return "ROLE_USER";
}

});
} else if(granted.getAuthority().equalsIgnoreCase("MY ADMIN GROUP")) {
mappedAuthorities.add(new GrantedAuthority() {
private static final long serialVersionUID = -5167156646226168080L;

@Override
public String getAuthority() {
return "ROLE_ADMIN";
}
});
}
}
return new User(username, "", true, true, true, true, mappedAuthorities);
}

@Override
public void mapUserToContext(UserDetails arg0, DirContextAdapter arg1) {
}
}

最佳答案

您还可以注入(inject)一个在 3.1 中引入的 GrantedAuthoritiesMapper 作为修改授权的一般策略。另外,您可能希望将 SimpleGrantedAuthority 用于 GrantedAuthority 实现。或者,您可以使用枚举,因为您有一组固定的值:

enum MyAuthority implements GrantedAuthority {
ROLE_ADMIN,
ROLE_USER;

public String getAuthority() {
return name();
}
}


class MyAuthoritiesMapper implements GrantedAuthoritiesMapper {

public Collection<? extends GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities) {
Set<MyAuthority> roles = EnumSet.noneOf(MyAuthority.class);

for (GrantedAuthority a: authorities) {
if ("MY ADMIN GROUP".equals(a.getAuthority())) {
roles.add(MyAuthority.ROLE_ADMIN);
} else if ("MY USER GROUP".equals(a.getAuthority())) {
roles.add(MyAuthority.ROLE_USER);
}
}

return roles;
}
}

关于spring - 使用 spring security 3.1 对事件目录进行身份验证时处理角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8835818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com