四 FAQ
4.1 FAQ
- Q: 能否脱离Spring框架来使用Acegi?
A: 虽然Acegi 没有要求必须使用Spring Framework,但事实上Acegi很大程度上利用了Spring的IOC和AOP,很难脱离Spring的单独使用。 - Q: Acegi有对xfire的支持吗?
A: 有,详见http://jira.codehaus.org/browse/XFIRE-389 - Q: 为何无论怎么设置都返回到登陆页面无法成功登陆?
A: 检查登陆页面或登陆失败页面是否只有ROLE_ANONYMOUS权限
4.2 Acegi 补习班
要了解Acegi,首先要了解以下几个重要概念:
-
Authentication
Authentication对象包含了principal, credentials 和 authorities(authorities要赋予给principal的),同时也可以包含一些附加的认证请求信息,如TCP/IP地址和Session id等。 -
SecurityContextHolder
SecurityContextHolder包含ThreadLocal私有属性用于存取SecurityContext, SecurityContext包含Authentication私有属性, 看以下一段程序
public void getSecurityContextInformations() {
SecurityContext sc = SecurityContextHolder.getContext();
Authentication auth = sc.getAuthentication();
Object principal = auth.getPrincipal();
if (principal instanceof UserDetails) {
//用户密码
String password = ((UserDetails) principal).getPassword();
//用户名称
String username = ((UserDetails) principal).getUsername();
//用户权限
GrantedAuthority[] authorities = ((UserDetails) principal).getAuthorities();
for (int i = 0; i < authorities.length; i++) {
String authority = authorities[i].getAuthority();
}
}
Object details = auth.getDetails();
if (details instanceof WebAuthenticationDetails) {
//用户session id
String SessionId = ((WebAuthenticationDetails) details).getSessionId();
}
} - AuthenticationManager
通过Providers验证在当前 ContextHolder中的Authentication对象是否合法。 - AccessDecissionManager
经过投票机制来审批是否批准操作 - RunAsManager
当执行某个操作时,RunAsManager可选择性地替换Authentication对象 - Interceptors
拦截器(如FilterSecurityInterceptor,JoinPoint,MethodSecurityInterceptor等)用于协调授权,认证等操作