我们在项目中使用Jetspeed并要求jetspeed应该对接受用户名和密码并返回用户对象的第三方休息服务进行身份验证。
我发现实现这一点而不会过多影响jetspeed的最简单直接的方法是编写一个自定义AuthenticationProvider来扩展DefaultAuthenticationProvider类并覆盖登录方法。
在我对用户进行身份验证后,我会收回用户详细信息,包括角色,电子邮件等。现在,如果用户已经存在于jetspeed数据库中,我会同步他的角色,否则我会创建用户并为他分配远程返回的角色服务。
现在我想要一种方法来设置user.email,user.firstname和user.lastname属性,以便可以使用psml文件中的$ jetspeed.getUserAttribute访问它。我们怎么能这样做?
这是我的代码[删除不必要的东西] -
public class CustomAuthenticationProvider extends BaseAuthenticationProvider {
....
public AuthenticatedUser authenticate(String userName, String password) throws SecurityException {
try {
//Login the user
UserSessionDTO customSession = Security.login(userName, password);
//Fetch the user details
UserDTO customUser = customSession.getUser();
//Get the user roles
List<UserRoleDTO> roles = customUser.getUserRoleDTOList();
//Verify/create the user in jetspeed user database
UserImpl user = null;
if (!um.userExists(customUser.getLoginId())) {
user = (UserImpl) um.addUser(customUser.getLoginId(), true);
//Standard data
user.setMapped(true);
user.setEnabled(true);
} else {
user = (UserImpl) um.getUser(customUser.getLoginId());
}
//Sync the portal user roles with the CMGI user roles
List<Role> portalRoles = rm.getRolesForUser(customUser.getLoginId());
for (Role portalRole : portalRoles) {
Boolean found = Boolean.FALSE;
for (UserRoleDTO role : roles) {
if (role.getRoleName().equalsIgnoreCase(portalRole.getName())) {
found = Boolean.TRUE;
break;
}
}
if(!found){
rm.removeRoleFromUser(userName, portalRole.getName());
}
}
for(UserRoleDTO role : roles){
rm.addRoleToUser(userName, role.getRoleName());
}
PasswordCredential pwc = new PasswordCredentialImpl(user, password);
UserCredentialImpl uc = new UserCredentialImpl(pwc);
AuthenticatedUserImpl authUser = new AuthenticatedUserImpl(user, uc);
return authUser;
}
.... } }
答案 0 :(得分:0)
您可以在位于security-managers.xml中的Jetspeed用户bean“org.apache.jetspeed.security.JetspeedPrincipalType.user”中添加自定义用户属性。
这些属性应该像这样定义 e.g
<bean class="org.apache.jetspeed.security.impl.SecurityAttributeTypeImpl">
<constructor-arg index="0" value="user.lastname" />
<constructor-arg index="1" value="info" />
</bean>