如何查询所有登录用户的CAS?

时间:2014-04-25 00:04:04

标签: java single-sign-on cas

我正在为所有内部应用程序组建一个SSO系统,并将使用CAS。我被要求制作一个简单的网络应用程序,其唯一目的是监控CAS并显示包含所有当前登录用户的用户名的页面。

我正在尝试找出查询CAS以获取此类信息的最佳方式。

我知道CAS有一个TicketRegistry的概念,它保存所有活动/有效门票的列表;每张票都有用户信息(我相信IPersonAttributeDao的形式)。也许有一个原因是为CAS查询其票证注册表的内容,并以某种方式获取每个人的属性的用户名信息?

如果不是故障单注册表,那么访问此信息的好方法是什么?

1 个答案:

答案 0 :(得分:2)

CAS protocol中没有任何内容允许查询服务器以获取当前活动门票的列表。

我假设您使用Jasig CAS作为服务器。我想你可以添加一个注入当前票证注册表的视图,控制器和域对象,并简单地调用TicketRegistry.getTickets()来获取所有票证(包括过期的票证)。您仍然需要调用getAuthentication来实现Ticket(它存在于ServiceTicket和ServiceGrantingTicket中,但我无法在任何超类或接口中找到它),然后是Authentication.getPrincipal()。

我不知道您将获得的PrincipalS列表是否包含重复项,但如果我是您,我将测试此类重复项。

CAS是一个Spring应用程序,所以首先要寻找添加这些东西的应该是cas-server-webapp / src / main / webapp / WEB-INF / cas-servlet.xml。

如果不知道您将使用的CAS的确切实施,我恐怕无法做更多。

cas-server-webapp是一个spring-mvc应用程序,所以你应该在Spring documentation中找到很多信息 - 请注意,由于CAS 3.1使用Spring的第2版,你应该看看http://docs.spring.io/spring-framework/docs/2.5.3/reference/

以下只是可以做的内容的骨架,是可能包含拼写错误或其他错误的未经测试的内容。此外,没有接口,视图名称是硬编码的,这是现实世界中不推荐的做法。必须考虑它是什么:一个可能实现的简化骨架示例。

域对象(可选)

private TicketRegistry ticketRegistry;
public class LoggedUsersService {
    public List<what_you_want> getLoggedInUsers() {
        List<Principal> userList; // or List<Authentication> or ...
        // extract pricipal list from ticketRegistry
        ...
        return userList;
    }
    public void setTicketRegistry(TicketRegistry ticketRegistry) {
        this.ticketRegistry = ticketRegistry);
    }
}

应在deployerConfigContext.xml

中声明
<bean id="loggedUserService" class="path_to/LoggerUserService">
    <property name="ticketRegistry" ref="ticketRegistry"/>
</bean>

它是可选的,因为你可以直接在控制器中执行这些操作......但是分离使测试更容易。

控制器

private LoggedUsersService loggedUsersService;
public class LoggedUserController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView mav = new ModelAndView();
        // set view name and optionaly whant you need to do
        mav.setViewName("loggedusers")
        mav.addObject("userList", loggedUserService.getLoggedInUsers());
        return mav;
    }
    public void setLoggedUsersService(LoggedUserService loggedUsersService) {
        this.loggedUsersService = loggedUsersService; 
    }
}

它应该在cas-servlet.xml中声明并包含在处理程序映射

<bean id="loggedUserController" class="path_to/LoggerUserService">
    <property name="ticketRegistry" ref="ticketRegistry"/>
</bean>
<bean id="handlerMappingC"
    ...
        <props>
...
            <prop key="/loggedUsers">loggedUsersController</prop>
        </props>
...
</bean>

视图

然后在loggedusers.jsp中,您可以访问请求范围内bean名称“userList”下的用户列表

<jsp:useBean id="userList" scope="request"/>