我遇到类似于this question的问题。但是,由于这个问题已有5年历史了,所以我想再问一次。
我的主要目标是在自定义登录模块中创建自定义主体。因此,我可以与应用程序的其余部分共享额外的信息(例如身份验证承载)。
这是我的自定义登录模块
public class MyCustomModule extends AppservPasswordLoginModule
{
@Override
protected void authenticateUser() throws LoginException
{
SecurityUtil.authenticateUser(_username, _passwd);
commitUserAuthentication(SecurityUtil.getGroups(_username));
}
@Override
public boolean commit() throws LoginException {
String username = getUsername();
if(super.commit()){
CustomPrincipal principal = new CustomPrincipal(username);
principal.setAuthHeader("this is an auth header");
_subject.getPrincipals().remove(_userPrincipal);
_userPrincipal = principal;
_subject.getPrincipals().add(principal);
return true;
}
return false;
}
}
但是,当我尝试在bean中使用我的委托人时:
@Named
@SessionScoped
public class AuthHelper implements Serializable {
private HttpServletRequest getHttpServletRequest() {
return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
}
private Principal getUserPrincipal() {
return getHttpServletRequest().getUserPrincipal();
}
public String getAuth(){
return ((CustomPrincipal) getUserPrincipal()).getAuthHeader();
}
}
我得到一个CastException。我已经尝试了很多事情,但似乎玻璃鱼成了自己的Principal,而完全忽略了我的。
谢谢!