Мне интересно, как PreAuthenticatedAuthenticationToken
получает свои полномочия. У меня есть реализация UserDetails, но:
@Override
public Collection<GrantedAuthority> getAuthorities() {
return grantedAuthorities;
}
никогда не вызывается. Это важно, потому что Spring Security (3.1) игнорирует тот факт, что я пытаюсь ограничить этот URL определенной ролью. Без роли в токене, он пропускает все. Спасибо, Эрик
public class XXXAuthenticationUserDetailsService implements
AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken>, UserDetailsService {
private XXXService xxxService = null;
@Override
public UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken token) throws UsernameNotFoundException {
String userID = asmService.getAuthorizedUserId((String) token.getPrincipal());
AidsBankingUser user = new AidsBankingUser();
Collection<Delegation> delegations = findRoles(userID);
user.setGrantedAuthroitiesAndAgency(delegations);
user.setUsername(userID);
return user;
}
private Collection<Delegation> findRoles(String userID) {
Collection<Delegation> delegations;
try {
delegations = xxService.getDelegationsByAppUser(Constants.APP_NAME_IN_XXX, userID, Constants.DO_NOT_INCLUDE_GUI_ROLES_FROM_XXX);
if (delegations == null || delegations.isEmpty()) {
Log.getGeneralLogger().fatal("No delegations returned by XXX");
throw new AccessDeniedException("User is authenticated but unauthorized. Please contact DPI.");
}
return delegations;
}
catch (DataAccessException e) {
Log.getGeneralLogger().fatal("XXX encountered a problem while retrieving delegations", e);
throw new AccessDeniedException("Internal problem. Please contact DPI.", e);
}
}
public void setXxxService(XXXService asmService) {
this.asmService = asmService;
}
@Override
public UserDetails loadUserByUsername(String arg0)
throws UsernameNotFoundException {
// TODO Auto-generated method stub
return null;
}
}
Мои данные пользователя:
public class XXXUser implements UserDetails {
private static final long serialVersionUID = 6930680558235002724L;
private Collection<GrantedAuthority> grantedAuthorities = null;
private String userID = null;
private Agency agency = null;
@Override
public Collection<GrantedAuthority> getAuthorities() {
return grantedAuthorities;
}
@Override
public String getPassword() {
return "b";
}
@Override
public String getUsername() {
return userID;
}
@Override
public boolean isAccountNonExpired() {
return false;
}
@Override
public boolean isAccountNonLocked() {
return false;
}
@Override
public boolean isCredentialsNonExpired() {
return false;
}
@Override
public boolean isEnabled() {
return false;
}
public Agency getAgency() {
return agency;
}
public void setAgency(Agency agency) {
this.agency = agency;
}
public void setUserID(String userID) {
this.userID = userID;
}
public void setUsername(String userID) {
this.userID = userID;
}
public void setGrantedAuthroitiesAndAgency(Collection<Delegation> delegations) {
grantedAuthorities = new ArrayList<GrantedAuthority>();
for (Delegation d: delegations) {
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_" + d.getRole().getId().toUpperCase()));
agency = d.getAgency();
}
if (grantedAuthorities.isEmpty()) {
grantedAuthorities.add(new SimpleGrantedAuthority(RoleEnum.ROLE_NOROLE.toString()));
}
}
}