aceig和cas后续问题总结

我是觉得把内容都发到一个地方太乱,而且看起来也不方便,所以干脆单独重新写一个得了。。。

1.在测试acegi和cas的集成时,把两个war包发布,并且已经生成相应证书,而且,CAS端我将数据验证改到数据库中,并且用户名和密码也更改了,发现,当登陆成功后,页面总是跳到acegi的测试首页,无论点击任何的连接都跳到首页,后来发现,在acegi客户端,有个users.properties文件,这个文件是充当acegi获取用户信息的地方,也就是说相当于数据库。里面存放的是用户信息和权限信息。开始我登陆成功后,CAS验证已经通过,但是,当分配权限的时候,我在CAS端把用户名和密码改了,但是在users.properties这个文件里面并没有这个用户名和密码,且没有对应的权限信息,所以,acegi在判断权限的时候就会抛出一个拒绝访问的异常,直接跳到authenticationFailureUrl所指定的页面。

2.acegi和cas整合的退出问题。
当用户登陆成功后,点登出后,系统并没有完全登出,因为j_acegi_logout销毁的只是acegi
客户端的Authentication对象,但是,如果不关闭页面的情况下,重新打开之前访问的受保护的页面,由于org.acegisecurity.ui.cas.CasProcessingFilter这个过滤器会重新找到登录时CAS的票根,因为客户端并没有通过https的形式退出,所以CAS服务器端并没有销毁票根。当获取到票根后,又会重新生成Authentication这个对象,所以,就算是点击了退出,也并没有退出。解决办法是,在acegi的logout这个过滤器中,将constructor-arg设置成<constructor-arg value="https://www-9a5718d7b04:8443/cas/logout"/>,这样,当用户点击退出后,首先到客户端的acegi的logout过滤器处理,将Authentication这个对象销毁,然后在到https://www-9a5718d7b04:8443/cas/logout处理CAS服务器端的销毁票根等操作,这样,就完全销毁了这个用户的权限和票根,完成完全退出操作。

3.在acegi配置文件中,有个AuthenticationProcessingFilter这个过滤器主要是做认证处理的,当用户登陆成功后,acegi将会把用户的登陆信息和权限信息放到SecurityContextHolder中,在应用中可以这样取出用户的登陆信息。
SecurityContext sc = SecurityContextHolder.getContext();
       Authentication auth = sc.getAuthentication();
       if (auth != null && auth.getPrincipal() instanceof UserDetails) {
             UserDetails ud = (UserDetails) auth.getPrincipal();

              //这里可以做用户登陆的操作。
       }
这个UserDetails 对象里面放的就是用户信息,ud.getUsername(), ud.getPassword();AuthenticationProcessingFilter这个过滤器可以自己扩展,只要继承了AuthenticationProcessingFilter这个类,重写requiresAuthentication这个方法就可以了,做一些比如登陆成功后,在SESSION放如用户信息等内容。

 

4.还有个过滤器叫LogoutFilter,这个过滤器是处理点击登出后,当过滤器拦截到/j_acegi_logout这个字符串后,acegi做销毁SecurityContextHolder中的用户信息和权限信息的操作。这个类也可以扩展,你可以直接在里面做一些用户登出后的操作。我们工程直接扩展org.acegisecurity.ui.logout.SecurityContextLogoutHandler这个类,这个类是LogoutFilter处理登出的一个过程,起功能是SecurityContextHolder调用clearContext();方法为销毁所有跟此用户有关的一切信息。

 

5.如果光用cas,不参与acegi,在登陆验证通过后,会将用户信息结果返回给客户端,在客户端可以通过session.getAttribute(CASFilter.CAS_FILTER_USER)的方式获取用户名称。

 

6.一般服务器端和客户端不再一个服务器,那么,当客户端通过机器名或者域名访问服务器端的机器时,需要,在C:/WINDOWS/system32/drivers/etchosts文件中加入访问的ip 机器名 对应的值。比如,我的客户端应用访问服务器端的cas,地址为https:// WWW-9A5718D7B04:8443/cas/login?service=http%3A%2F%2F192.168.0.55%3A8080%2FwebTest2%2Findex.jsp,那么,WWW-9A5718D7B04这个就是cas服务器端的机器名,因此,需要在hosts文件中加入192.168.0.55    WWW-9A5718D7B04 IP地址 对应 机器名 ,这样才能访问,否则无法访问。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值