Posted on 2007-01-01 13:44
itspy 阅读(1448)
评论(0) 编辑 收藏 所属分类:
JAVA技术
Appfuse是个比较好的J2EE开发框架,我在实际开发中遇到这样的问题,就是要对登录用户的一些关键操作进行日志记录,以备将来审记时使用,但是发现它好像没有直接提供类似的方法,只好自己去看原码来研究了。
Appfuse的登录,权限控制都是通过Acegi来实现的,通过网上查找,看资料先后找到了两个方法,和大家分享一下。
1)方案一
在Appfuse中如何得到当前登录用户?
public String getCurrentUser(HttpServletRequest request){
String userID;
HttpSession session = request.getSession();
userID=(String)session.getAttribute(AuthenticationProcessingFilter.ACEGI_SECURITY_LAST_USERNAME_KEY) ;
return userID;
}
此方法好像通过保存session,而不是输入用户名来登录时好像会有问题(没有详细去确认)。
2)方案二
Appfuse的org.appfuse.model.User实现接口org.acegisecurity.userdetails.UserDetails
而Authentication接口定义了一个方法 public Object getPrincipal();
Object这个对象在appfuse实现了org.acegisecurity.userdetails.UserDetails
所以只要能够在Appfuse中得到Authentication就可以得到当前用户名了。
static public String getCurrentUserID() {
SecurityContext ctx = SecurityContextHolder.getContext();
Authentication auth = ctx.getAuthentication();
if (auth != null) {
//注:为了代码的简捷易读,此处省略了变量转型时的检查,不过在默认的Appfuse中是不会出问题的。
UserDetails user = (UserDetails)auth.getPrincipal();
return user.getUsername();
} else {
return null;
}
}
方案二参考文献:
http://www.blogjava.net/youlq/archive/2006/03/03/33487.html
其它相关参考:
http://www.blog.sh/u4/wealupa/79288.html
http://www.javaeye.com/article/17896?page=3