Как запросить CAS для всех зарегистрированных пользователей?

Я создаю систему единого входа для всех наших внутренних приложений и буду использовать CAS. Меня попросили сделать простое веб-приложение, единственной целью которого является мониторинг CAS и отображение страницы, содержащей имена всех пользователей, вошедших в систему в данный момент.

Я пытаюсь найти лучший способ запросить CAS для получения такой информации.

Я знаю, что CAS имеет концепцию TicketRegistry, которая хранит список всех активных/действительных билетов; где каждый билет имеет информацию о пользователе (я думаю, в виде IPersonAttributeDao). Возможно, есть смысл запрашивать у CAS содержимое его реестра билетов и каким-то образом получать информацию об имени пользователя атрибута каждого человека?

Если не реестр билетов, что было бы хорошим способом получить доступ к этой информации?


person AdjustingForInflation    schedule 25.04.2014    source источник
comment
Думаю, мне просто нужен способ доступа к Principal на основе связанного с ним Ticket.   -  person AdjustingForInflation    schedule 25.04.2014
comment
Вот CAS 3.1. Javadocs, которые, вероятно, применимы к этому вопросу.   -  person AdjustingForInflation    schedule 28.04.2014


Ответы (1)


В CAS-протоколе нет ничего, что позволяло бы запрашивать у сервера список текущих активных заявок.

Я предполагаю, что вы используете 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 — обратите внимание, что поскольку CAS 3.1 использует версию 2 Spring, вам следует посмотреть 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"/>
person Serge Ballesta    schedule 29.04.2014
comment
Спасибо, @Serge Ballesta! - Да, я использую JASIG CAS 3.1 (см. ссылку выше для Javadocs). Кроме того, я не менял никаких конфигов в cas-servlet.xml или deployerConfigContext.xml. Если вам нужно, чтобы я посмотрел, какие бобы вводятся, пожалуйста, дайте мне знать, что вам нужно увидеть. Можете ли вы привести пример кода, на который может быть похож этот процесс? Еще раз спасибо! - person AdjustingForInflation; 29.04.2014
comment
Похоже, CAS 3.1 — довольно старая версия. Согласно странице дорожной карты на wiki.jasig.org/display/CAS/CAS+Roadmap текущая версия 3.5.x с июля 2012 года. Есть ли у вас причина использовать такой старый сервер? Для меня это не проблема, но в файле конфигурации могут быть изменения синтаксиса. - person Serge Ballesta; 30.04.2014