我正在为所有内部应用程序组建一个SSO系统,并将使用CAS。我被要求制作一个简单的网络应用程序,其唯一目的是监控CAS并显示包含所有当前登录用户的用户名的页面。
我正在尝试找出查询CAS以获取此类信息的最佳方式。
我知道CAS有一个TicketRegistry
的概念,它保存所有活动/有效门票的列表;每张票都有用户信息(我相信IPersonAttributeDao
的形式)。也许有一个原因是为CAS查询其票证注册表的内容,并以某种方式获取每个人的属性的用户名信息?
如果不是故障单注册表,那么访问此信息的好方法是什么?
答案 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"/>