【发布时间】:2012-01-13 03:02:52
【问题描述】:
我有一个与 REST 服务和 Spring Security 配合使用的应用程序。我有基本身份验证,需要硬登录和软登录。
场景是:当用户登录时,他被分配了 ROLE_SOFT 并且可以访问需要 ROLE_SOFT 的 URL,但是如果他想访问需要 ROLE_HARD 的 URL,他必须向指定的 Web 服务发送一些代码或一些东西。
所以我读了这个 Acegi Security: How do i add another GrantedAuthority to Authentication to anonymous user
之后我创建了我的:
public class AuthenticationWrapper implements Authentication
{
private Authentication original;
public AuthenticationWrapper(Authentication original)
{
this.original = original;
}
public String getName() { return original.getName(); }
public Object getCredentials() { return original.getCredentials(); }
public Object getDetails() { return original.getDetails(); }
public Object getPrincipal() { return original.getPrincipal(); }
public boolean isAuthenticated() { return original.isAuthenticated(); }
public void setAuthenticated( boolean isAuthenticated ) throws IllegalArgumentException
{
original.setAuthenticated( isAuthenticated );
}
public Collection<? extends GrantedAuthority> getAuthorities() {
System.out.println("EXISTING ROLES:");
System.out.println("Size=:"+original.getAuthorities().size());
for (GrantedAuthority iterable : original.getAuthorities()) {
System.out.println(iterable.getAuthority());
}
GrantedAuthority newrole = new SimpleGrantedAuthority("ROLE_HARD");
System.out.println("ADD new ROLE:"+newrole.getAuthority());
Collection<? extends GrantedAuthority> originalRoles = original.getAuthorities();
ArrayList<GrantedAuthority> temp = new ArrayList<GrantedAuthority>(originalRoles.size()+1);
temp.addAll(originalRoles);
temp.add(newrole);
System.out.println("RETURN NEW LIST SIZE"+temp.size());
for (GrantedAuthority grantedAuthority : temp) {
System.out.println("NEW ROLES:"+grantedAuthority.getAuthority());
}
return Collections.unmodifiableList(temp);
}
和控制器
@Controller
@RequestMapping("/login")
public class LoginControllerImpl implements LoginController {
LoginService loginService;
@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
@ResponseBody
public User getUserSettings(){
loginService=new LoginServiceImpl();
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
AuthenticationWrapper wrapper = new AuthenticationWrapper(auth);
SecurityContextHolder.getContext().setAuthentication( wrapper );
return loginService.getUser();
}
}
但是在我更改身份验证后,我的会话停止了.. 也许有人知道更好的解决方案...
【问题讨论】:
标签: java security spring-security