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


Автор: Zamuta 27.2.2007, 13:49
Всем привет. Вопрос касательно настройки Acegi....

Проблема в настройке userDetailsService.
Если делаю так: 
Код

<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
  <property name="userDetailsService">
   <bean class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
    <property name="userMap">
     <value>
      user1=test123,/permissions/permission1,/permissions/permission01
      user2=test123,/permissions/permission01
     </value>
    </property>
   </bean>
  </property>
 </bean>

То всё работает....

А если пытаюсь через БД, вот так:
Код

<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
        <property name="userDetailsService" ref="userDetailsService"/>
        <property name="userCache">
            <bean class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
                <property name="cache">
                    <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
                        <property name="cacheManager">
                            <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
                        </property>
                        <property name="cacheName" value="userCache"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
    
    <bean id="userDetailsService" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
    </bean>
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:mysql://localhost:3306/registration</value>
        </property>
        <property name="username">
            <value>root</value>
        </property>
        <property name="password">
            <value>pass</value>
        </property>
    </bean>

 то не получается. Говорит Error listenerStart, он всегда так говорит если есть ошибка в файле настроек acegi, applicationContext.xml или у него что-то не получается.Т.е более подробного разъяснения ошибки мне от него добиться не удалось, поэтому спрашиваю у вас....  

З.Ы. Таблицы созданы как в  http://acegisecurity.org/dbinit.txt, драйвер бд в библиотеке лежит.

Автор: Zamuta 3.3.2007, 11:33
В applicationContext.xml :
Код

<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
    <property name="userDetailsService">
        <bean class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
             <property name="dataSource">
                <bean class="org.springframework.jndi.JndiObjectFactoryBean">
                    <property name="jndiName" value="java:comp/env/jdbc/dataSource"/>
                </bean>               
            </property>
            <property name="usersByUsernameQuery">
                <value>SELECT username,password,enabled FROM users WHERE username = ?</value>
            </property>
            <property name="authoritiesByUsernameQuery">
                <value>SELECT username,authority FROM authorities WHERE username = ?</value>
            </property>
        </bean>
    </property>     
</bean>    

Автор: Zamuta 3.3.2007, 23:01
С базой данных теперь всё в порядке, но что делать со значениями 'enabled'  и 'authority' если все пользователи у меня имеют одинаковые роли и все активны? А не использовать эти параметры нельзя...

Неужели никто не работал с Acegi? Tux, вроде ты его хвалил.... 

Автор: Adept 22.3.2007, 14:39
Та же трабла, ктонить знает как сделать?

Автор: Zamuta 22.3.2007, 18:09
Adept, да я потом разобрался. Сделал так, при регистрации нового пользователя в sql запросе добавляем в столбец 'enabled' - true , если захочешь можешь потом просто вписать туда 'false' и юзер станет отключенным. А в столбец 'authority' ту роль какая у тебя по умолчанию. А потом если вдруг появится новая группа юзеров просто будешь добавлять для них другую роль.

Код

stmt.execute("INSERT INTO reg (username, email, password, enabled) VALUES ('"+nickName+"', '"+mail+"', '"+pass+"', true);");
stmt.execute("INSERT INTO authorities (username, authority) VALUES ('"+nickName+"', 'ROLE_CUSTOMER');");

Автор: Adept 29.3.2007, 13:47
Цитата(Zamuta @ 22.3.2007,  18:09)
Adept, да я потом разобрался. Сделал так, при регистрации нового пользователя в sql запросе добавляем в столбец 'enabled' - true , если захочешь можешь потом просто вписать туда 'false' и юзер станет отключенным. А в столбец 'authority' ту роль какая у тебя по умолчанию. А потом если вдруг появится новая группа юзеров просто будешь добавлять для них другую роль.

Код

stmt.execute("INSERT INTO reg (username, email, password, enabled) VALUES ('"+nickName+"', '"+mail+"', '"+pass+"', true);");
stmt.execute("INSERT INTO authorities (username, authority) VALUES ('"+nickName+"', 'ROLE_CUSTOMER');");

Вот, опять руки дошли  smile 
Я нехочу добавлять в таблицу ненужные столбцы. У меня только одна роль supervisor.
Я хотелбы узнать, почему вот так неработает?
Код

<property name="usersByUsernameQuery">
         <value>SELECT login as username, pwd as password, 'true' as enabled FROM tbUsers WHERE login = ?</value>
</property>
<property name="authoritiesByUsernameQuery">
        <value>SELECT login as username, 'ROLE_SUPERVISOR' as authority FROM tbUsers WHERE login = ?</value>
</property>    

Столбцов enabled и authority в таблице нет, я поставил необходимые значения.
непроходит аутентификация (в бд введенные логин, пароль точно есть)
Код

[DEBUG] 14:04:08 ProviderManager - Authentication attempt using org.acegisecurity.providers.dao.DaoAuthenticationProvider
[ WARN] 14:04:08 LoggerListener - Authentication event AuthenticationFailureBadCredentialsEvent: www; details: org.acegisecurity.ui.WebAuthenticationDetails@fffe3f86: RemoteIpAddress: 127.0.0.1; SessionId: 5FFC8313C06A4A664BD66289C0596997; exception: Bad credentials
[DEBUG] 14:04:08 AuthenticationProcessingFilter - Updated SecurityContextHolder to contain null Authentication
[DEBUG] 14:04:08 AuthenticationProcessingFilter - Authentication request failed: org.acegisecurity.BadCredentialsException: Bad credentials

Автор: Zamuta 29.3.2007, 14:39
Adept, посмотри внимательнее как это рекомендуют делать у них на сайте http://acegisecurity.org/dbinit.txt. Сам не проверял, но есть подозрение на то, что эти данные должны лежать в разных таблицах (у меня они лежат в разных). Т.к. это разные механизмы авторизация и аутентификация соответственно. 

А если у тебя только одна роль supervisor, то добавляй вместо 'ROLE_CUSTOMER' свой 'supervisor', но тогда защищённые ресурсы нужно соответственно переписать на другую роль.

Код

<bean id="filterSecurityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
        <property name="authenticationManager"><ref bean="authenticationManager"/></property>
        <property name="accessDecisionManager">
            <bean class="org.acegisecurity.vote.AffirmativeBased">
                <property name="allowIfAllAbstainDecisions" value="false"/>
                <property name="decisionVoters">
                    <list>
                        <bean class="org.acegisecurity.vote.RoleVoter">
                            <property name="rolePrefix">
                                <value></value>
                            </property>
                        </bean>
                        <bean class="org.acegisecurity.vote.AuthenticatedVoter" />
                    </list>
                </property>
            </bean>
        </property>
        <property name="objectDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                /private_page.jsp=supervisor
                /login.jsp=ROLE_ANONYMOUS
            </value>
        </property>
    </bean>     

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