0

В настоящее время я работаю над приложением на основе Java. Что мне нужно, авторизовать пользователя с несколькими ролями, например, Питер должен иметь роль ROLE_SETTING, ROLE_REPORT, ROLE_QUOTE, в то время как Энн имеет только одну роль ROLE_SETTING и т.д. ...Spring security jdbc config для пользователя auth с несколькими ролями

Вот моя весна-безопасности config.xml

<beans:beans xmlns="http://www.springframework.org/schema/security" 
xmlns:beans="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-3.0.xsd 
http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 

<http auto-config="true"> 
    <access-denied-handler error-page="/403page" /> 
    <intercept-url pattern="/makebill*" access="ROLE_ADMIN,ROLE_MAKEBILL" /> 
    <intercept-url pattern="/report*" access="ROLE_ADMIN,ROLE_REPORT" /> 
    <intercept-url pattern="/stock*" access="ROLE_ADMIN,ROLE_STOCK" /> 
    <intercept-url pattern="/customer*" access="ROLE_ADMIN,ROLE_CUSTOMER" /> 
    <!-- <intercept-url pattern="/setting*" access="ROLE_ADMIN,ROLE_SETTING" /> --> 
    <intercept-url pattern="/mainmenu*" access="ROLE_ADMIN,ROLE_MAKEBILL,ROLE_SETTING,ROLE_CUSTOMER,ROLE_REPORT,ROLE_STOCK" /> 
    <form-login 
    login-page='/login' username-parameter="username" 
    password-parameter="password" default-target-url="/mainmenu" 
    authentication-failure-url="/login?authfailed" /> 
    <logout logout-success-url="/login?logout" /> 
</http> 

<authentication-manager> 
    <authentication-provider> 
     <jdbc-user-service 
      data-source-ref="dataSource" 
      users-by-username-query="select username,password, enabled from person where username=?" 
      authorities-by-username-query="select username, role from person, role where username =? " /> 
    </authentication-provider> 
</authentication-manager> 


</beans:beans> 

аутентификации-менеджер в настоящее время работает нормально только с одной ролью, что я имею в виду ... когда работает SQL запрос authorities-by-username-query="select username, role from person, role where username =? ", если возвращаемое значение только одна роль, например ROLE_REPORT, приложение работает отлично, но если есть запись в db like, ROLE_REPORT,ROLE_SETTING,ROLE_CUSTOMER, когда запрос получает это значение, приложение вернет мне ошибку 404, похоже, я не смогу предоставить пользователю m исключительные роли.

Может кто-нибудь указать мне, что я сделал неправильно. Спасибо.

+0

Есть несколько мест, которые необходимо исправить. Во-первых, запрос по имени пользователя не подходит. Я думаю, что вы новичок в SQL-запросе. Вы извлекаете 2 таблицы, не присоединяя их к какому-либо ключу. Пожалуйста, взгляните на это http://stackoverflow.com/questions/20455139/users-by-username-query-returns-no-results. Это может не решить всю вашу проблему. Дайте мне знать, если у вас другая проблема. – Tin

+0

Вы можете найти этот учебник полезным: http://www.mkyong.com/spring-security/spring-security-form-login-using-database/ – Tin

+0

mkyong's tut предназначен для предоставления одной роли для одного пользователя, что мне нужно множественная роль для одного пользователя ... – seph

ответ

0

Я нашел решение сам, реализуемый свои UserDetails, вот код

@Service("assembler") 
public class Assembler { 

    @Transactional(readOnly = true) 
    User buildUserFromUserEntity(Person person) { 

    String username = person.getUsername(); 
    String password = person.getPassword(); 
    boolean enabled = true; 

    List<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>(); 
    String[] authStrings = person.getRole().split(","); 
    for(String authString : authStrings) { 
     System.out.println("all auth roles: " + authString); 
     authorities.add(new SimpleGrantedAuthority(authString)); 
    } 


    User user = new User(username, password, enabled, 
     true, true, true, authorities); 

    return user; 
    } 
} 






@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService { 

    @Autowired private PersonService personService; 
    @Autowired private Assembler assembler; 

    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(String username) 
     throws UsernameNotFoundException, DataAccessException { 

    UserDetails userDetails = null; 
    Person person = null; 

    List<Person> listPeople = personService.listPeople(); 
    for (Person p: listPeople) { 
     if (p.getUsername().equals(username)) { 
      person = p; 
     } 
    } 

    if (person == null) 
     throw new UsernameNotFoundException("user not found"); 

    return assembler.buildUserFromUserEntity(person); 
    } 
} 

и вот весной-SECURITY-config.xml

<http auto-config="true"> 
    <access-denied-handler error-page="/403page" /> 
    <intercept-url pattern="/makebill*" access="ROLE_ADMIN,ROLE_MAKEBILL" /> 
    <intercept-url pattern="/report*" access="ROLE_ADMIN,ROLE_REPORT" /> 
    <intercept-url pattern="/stock*" access="ROLE_ADMIN,ROLE_STOCK" /> 
    <intercept-url pattern="/customer*" access="ROLE_ADMIN,ROLE_CUSTOMER" /> 
    <intercept-url pattern="/setting*" access="ROLE_ADMIN,ROLE_SETTING" /> 
    <intercept-url pattern="/mainmenu*" access="ROLE_ADMIN,ROLE_MAKEBILL,ROLE_SETTING,ROLE_CUSTOMER,ROLE_REPORT,ROLE_STOCK" /> 
    <form-login 
    login-page='/login' username-parameter="username" 
    password-parameter="password" default-target-url="/mainmenu" 
    authentication-failure-url="/login?authfailed" /> 
    <logout logout-success-url="/login?logout" /> 
</http> 


<beans:bean id="daoAuthenticationProvider" 
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <beans:property name="userDetailsService" ref="userDetailsService"/> 
</beans:bean> 

<beans:bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <beans:property name="providers"> 
    <beans:list> 
     <beans:ref local="daoAuthenticationProvider" /> 
    </beans:list> 
    </beans:property> 
</beans:bean> 

<authentication-manager> 
    <authentication-provider user-service-ref="userDetailsService"> 

    </authentication-provider> 
</authentication-manager> 

теперь я могу назначить несколько ролей для одного пользователя. Спасибо за чтение :)

 Смежные вопросы

  • Нет связанных вопросов^_^