Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > SpringSecurity & CAS


Автор: Samotnik 3.2.2010, 19:03
привет ! 
Такая задача: сейчас в приложении юзеры и пароли читаются из userlist.xml, а надо, чтобы это происходило через SSO. 
Вопрос: 
Примерами, ссылками не поможете?  Как прикрутить sso  к приложению ? 

Автор: MisterCleric 3.2.2010, 19:40
http://www.google.com/search?q=springsecurity+%26+CAS

Автор: Samotnik 3.2.2010, 22:21
MisterCleric,  а какой-нибудь small example  реально найти ? smile 

Автор: Samotnik 6.2.2010, 03:25
up
нужен пример аутентификации с использованием sso  

Автор: Samotnik 8.2.2010, 11:53
MisterCleric, так что с примером ? он существует ?  
С чего хоть начинать  smile 

Автор: MisterCleric 8.2.2010, 11:55
А что Гугл говорит?
Просто в референс читал, что есть такая вохможность, а как и что не разбирался.
Я тебе показал возможный путь поиска, а дальше сам разбирайся и ищи что и как необходимо установить и настроить. Ведь в этом наша работа - программистов - и заключается...

Автор: Samotnik 8.2.2010, 11:56
ясно. сенкс smile 

Автор: Samotnik 8.2.2010, 14:59
что-то туговато у меня это идет все. 
Вобщем, народ, если кто с таким сталкивался - просьба покажите пажалста пример как добавить SSO  аутентификацию к приложению

Автор: garbuz 8.2.2010, 15:14
Samotnik, сервер приложений какой? Вообще веб или нет?

Автор: Samotnik 8.2.2010, 15:22
веб  tomcat

Добавлено через 9 минут и 11 секунд
нашел вот такой механизм http://www.jasig.org/cas.  пытаюсь в нем разобраться. 
Скачал, подсунул варку под томкат, и чета заработало даже smile теперь осталось это "чета заработало" на свой проект перенести 

Автор: Samotnik 8.2.2010, 17:40
Spring Security  может решить эту проблему ?

Добавлено через 23 секунды
приложение НЕ на спринге. Просто Веб на сервлетах

Автор: MisterCleric 8.2.2010, 18:00
Цитата

Spring Security  может решить эту проблему ?


А эт не важно какое у тебя приложение. Spring Security работает на базе фильтров и ты сам в его конфиге прописываешь, что секьюрить, как, и где авторизовать пользователей. Основной части приложения секьюрити не затрагивает. Потом ты сможешь его отключить, просто закоментировав соответсвующий фильтр в web.xml, и ничего у тебя не поламаеться. Чем хорош этот Spring Security, что он не привязывается к логики приложения и все вещи настраиваются декларативно. А также он предоставляет унифицированный способ секьюрности. Нам достаточно всего лишь указать какой тип мы будем использовать, т.е. как авторизовать пользователей, как доставать и трекать роли и права юзеров. В моем случае это LDAP и DB. В твоем - SSO. Просто надо не лениться и почитать доки, а потом порыться в инэте.

Вот сколько работаю программистом - все больше убеждаюсь, что все идеи, какие возникают при реализации тех или иных задач в проекте, уже кто-то реализовал. Просто надо найти этот "велосипед" и "нога на педале" в свой проект.

Автор: Samotnik 8.2.2010, 19:45
MisterCleric, маленького примера SpringSecurity тоже не существует ?

Автор: garbuz 8.2.2010, 21:22
Цитата(Samotnik @  8.2.2010,  19:45 Найти цитируемый пост)
MisterCleric, маленького примера SpringSecurity тоже не существует ? 

их навалом. Вот например http://www.mularien.com/blog/2008/07/07/5-minute-guide-to-spring-security/

Автор: MisterCleric 8.2.2010, 23:19
Samotnik, знаешь, не в обиду сказано: у тебя, что нет доступа к гуглу?..
Или как ты вообще учишся программированию? Поищи тут по форуму: полно было вопрос о http://forum.vingrad.ru/index.php?forums=113&cat_forum=forum_id&act=Search&joinname=1&CODE=do_and_show_extern_search&keywords=Spring+security
А вот что гугл говорит: http://www.google.com.ua/search?q=Spring+Security+%26+sso
Да, а вот тема, которую ты сам и подымал:
http://forum.vingrad.ru/forum/topic-273750/anchor-entry1977483/0.html#st_0_view_0

Автор: Samotnik 9.2.2010, 14:21
Спасибо. MisterCleric,  garbuz,  но поиск по форуму именно c SSO не дает результатов. 
Вобщем кое как разобрался.  Имею :
Настроенный tomcat c SSO   по https://localhost:8443/cas/login   выскакивает мое окошко для регистрации. Есть сервер  cas.war подложенный в webapps  в томкате
теперь, я так понимаю, код не нужно писать, а нужно просто подложить нужные жарки под проект и законфигурять xml ? 
Смотрю http://static.springsource.org/spring-security/site/docs/3.0.x/reference/cas.html  ничегошеньки не понятно  smile 

Я интуитивно мыслю так: Мне нужно как-то отредактировать web.xml (для логина) и добавиьт какой-то спринговский контекст для обработки этого кас сервера. так ? 

Нашел еще http://www.acegisecurity.org/guide/springsecurity.html  но результат особо тоже нету ((((
Создал applicationContext.xml  положил туда это, но IDEA  подсвечивает следующее :
Код

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

            <bean
                id="authenticationManager"
                class="org.jasig.cas.authentication.AuthenticationManagerImpl">
                <property name="credentialsToPrincipalResolvers">
                    <list>
                        <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" />
                        <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver" />
                    </list>
                </property>

                <property name="authenticationHandlers">
                    <list>
                        <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" />
                        <bean class="org.acegisecurity.adapters.cas3.CasAuthenticationHandler">  //  это не может найти
                            <property name="authenticationManager" ref="acegiAuthenticationManager" />
                        </bean>
                    </list>
                </property>
            </bean>


            <bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">  // Это не может найти
                  <property name="userMap">
                    <value>
                        marissa=koala,ROLES_IGNORED_BY_CAS
                        dianne=emu,ROLES_IGNORED_BY_CAS
                        scott=wombat,ROLES_IGNORED_BY_CAS
                        peter=opal,disabled,ROLES_IGNORED_BY_CAS
                    </value>
                </property>
            </bean>

            <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">  // Это не может найти
                 <property name="userDetailsService"><ref bean="inMemoryDaoImpl"/></property>
            </bean>

            <bean id="acegiAuthenticationManager" class="org.acegisecurity.providers.ProviderManager">  // Это не может найти
                <property name="providers">
                  <list>
                    <ref bean="daoAuthenticationProvider"/>
                  </list>
                </property>
            </bean>
        </beans>



Добавлено через 7 минут и 22 секунды
или, мне это вообще не нужно, если сервер уже есть и работает ?  

Автор: Samotnik 9.2.2010, 17:51
Вобщем. еще немного почитал и разобрался. 
Судя по всему у меня лежит http://www.jasig.org/cas  smile  
значит так. 
имеется : 
sso tomcat -  по адресу https://localhost:8443/cas/login
tomcat c веб приложением - по адресу http://localhost:8080/
мой web.xml
Код

 <context-param>  
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/applicationContext.xml</param-value>
     </context-param>

    <filter>
      <filter-name>CAS Authentication Filter</filter-name>
      <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
      <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>https://localhost:8443/cas/login</param-value>
      </init-param>
    </filter>

    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


applicationContext.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:sec="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

    <description> Description ...</description>

    <bean name="CAS Authentication Filter"    class="org.jasig.cas.client.authentication.AuthenticationFilter"
        p:casServerLoginUrl="https://localhost:8443/cas/login"
        p:renew="false"
        p:gateway="false"
        p:service="http://localhost:8080/" />

    
</beans>



запускаю приложение.  Томкат пишет вот такую ошибку 
Цитата

SEVERE: Exception starting filter CAS Authentication Filter
java.lang.IllegalArgumentException: serverName or service must be set.
    at org.jasig.cas.client.util.CommonUtils.assertTrue(CommonUtils.java:82)
    at org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:77)
    at org.jasig.cas.client.authentication.AuthenticationFilter.init(AuthenticationFilter.java:69)
    at org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:63)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3800)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4450)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
    at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:556)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
09.02.2010 16:47:35 org.apache.catalina.core.StandardContext start


что подскажите ?

Добавлено через 1 минуту и 12 секунд
Ведь service у меня задан  smile   что не так ? 
Может не до конца всё законфигурял ? 

Автор: Samotnik 9.2.2010, 19:27
Что- то заработало smile    smile 
web.xml
Код

<context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/applicationContext.xml</param-value>
     </context-param>

    <filter>
      <filter-name>CAS Authentication Filter</filter-name>
      <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
      <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>https://localhost:8443/cas/login</param-value>
      </init-param>
      <init-param>
        <param-name>serverName</param-name>
        <param-value>http://localhost:8090</param-value>
      </init-param>
    </filter>

    <filter>
      <filter-name>CAS Validation Filter</filter-name>
      <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
      <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <param-value>https://localhost:8443/cas</param-value>
      </init-param>
      <init-param>
        <param-name>serverName</param-name>
        <param-value>http://localhost:8090</param-value>
      </init-param>
    </filter>

    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/auth</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


applicationContext.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:sec="http://www.springframework.org/schema/security"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
     <description>Description</description>  

    <bean name="authenticationFilter" class="org.jasig.cas.client.authentication.AuthenticationFilter"
        p:casServerLoginUrl="https://localhost:8443/cas/login"
        p:renew="false"
        p:gateway="false"
        p:service="http://localhost:8090/mainpage" />

    <bean name="ticketValidationFilter"    class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter"
        p:service="http://localhost:8090/mainpage">
        <property name="ticketValidator">
            <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
                <constructor-arg index="0" value="https://localhost:8443/cas" />
            </bean>
        </property>
    </bean>

</beans>


значит вот что сейчас происходит : 
Загружаю приложение localhost:8090/ -  меня перекидывает на мой  КАС  smile      но блин, не все так круто smile  я то ввожу логин/пароль, а мне в ответ, что не верный логин/пароль.   smile   
С чем это может быть связанно ? 

А вообще мой  applicationContext.xml правильный ?

Добавлено через 10 минут и 18 секунд
хахаах 
я закоментировал строчку в  web.xml
Код

<context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/applicationContext.xml</param-value>
     </context-param>


и тоже самое происходит smile)))
Видимо мой applicationContext.xml вообще не читается smile 

Автор: Samotnik 9.2.2010, 21:54
кто-нибудь что-нибудь может посоветовать ? 
Я в тупике  smile 
Срабатывает CAS сервер, но после ввода логин/паролль пишет что не верно и все   smile 

Автор: MisterCleric 9.2.2010, 22:47
Samotnik, Вот если бы сталкивались с такими задачами, то что б и подсказали...
А так приятно наблюдать, что хоть кто-то свои мысли и продвижения по решению задачи тут высказывает. Спасибо тебе.
Единственное, что меня смущает, что у тебя дублируется код как в web.xml так и applicationContext.xml 

Автор: dobrolub 9.2.2010, 23:26
предложу два варианта, чтобы подсмотреть что-же в действительности происходит

1. подсмотреть запросы и ответы к сервакам (firefox + httpfox plugin) (firefox + taperdata plugin)
2. включить логгинг в спринге и cas и почитать логи. 

сам-бы наверно начал с номера 1 smile

Автор: Samotnik 10.2.2010, 13:59
Цитата(dobrolub @  9.2.2010,  22:26 Найти цитируемый пост)
httpfox plugin

подскажи пажалста как им пользоваться ? на что смотреть ? 
Я установил, но по моему  firebug  больше полезной инфы выдает, чем эта штука. Или я не туда смотрю ? 

Автор: dobrolub 10.2.2010, 19:31
в плагине надо смотреть на кукис, на редиректы и на значения http headers. и пытатъся понять, что эти два сервака делают (cas и собственно аппликуха) и что им не хватает.

Автор: Samotnik 11.2.2010, 21:47
вобщем, проблема решена  smile 
фуф блин. Значит так, если нужно сделать ображение к кас серверу, то спринг не нужен (ну впринципе и можно прикрутить, по желанию) 
значит так, все предельно просто smile  в web.xml  просто мапим фильтры
Код

 <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8090/</param-value>
        </init-param>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>https://localhost:8443/cas/login</param-value>
        </init-param>
        <init-param>
            <param-name>service</param-name>
            <param-value>http://localhost:8090/auth</param-value>
        </init-param>
    </filter>    

    <filter>
      <filter-name>CAS Validation Filter</filter-name>
      <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
      <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <param-value>https://localhost:8443/cas</param-value>
      </init-param>
      <init-param>
        <param-name>serverName</param-name>
        <param-value>http://localhost:8090</param-value>
      </init-param>
      <init-param>
          <param-name>redirectAfterValidation</param-name>
          <param-value>true</param-value>
      </init-param>
    </filter>
   
    <filter>
      <filter-name>CAS Assertion Thread Local Filter</filter-name>
      <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>

    <filter>
       <filter-name>CAS Single Sign Out Filter</filter-name>
       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>       
    </filter>


    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
       <filter-name>CAS Single Sign Out Filter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>


    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>


и все smile  больше собственно ничего и не нужно.   
Еще, если вам нужно будет впоследствии выцепить имя пользователя, который залогинился, то это можно сделать вот так
Код

String userName = AssertionHolder.getAssertion().getPrincipal().getName();


Спасибо всем за посильную помощь  smile   и Sten'у за помощь по аське smile)) 


Пэ.Эс.
Могу еще выложить маппинг со Спрингом

Автор: Ninken 13.5.2010, 12:00
удалено

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)