2015-01-31 2 views
0

У меня есть две таблицы в моей базе данных. Пользователь и user_role.Spring, @RolesAllowed и база данных для защиты страниц

CREATE TABLE `user` (
    `username` varchar(50) NOT NULL, 
    `password` varchar(255) NOT NULL, 
    `enable` tinyint(4) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`username`), 
    UNIQUE KEY `unique_username` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `user_roles` (
    `user_role_id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(45) NOT NULL, 
    `ROLE` varchar(45) NOT NULL, 
    PRIMARY KEY (`user_role_id`), 
    UNIQUE KEY `uni_username_role` (`ROLE`,`username`), 
    KEY `fk_username_idx` (`username`), 
    CONSTRAINT `fk_username` FOREIGN KEY (`username`) REFERENCES `user` (`username`) 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 

«роль» в user_roles показать роли, которые пользователь имеет {ROLE_USER, ROLE_ADMIN}

Я хотел бы использовать @RolesAllowed, чтобы запретить доступ пользователей к некоторым страницам (и предоставлять доступ к админам) , но я не знаю, как получить user_role из базы данных и отправить его в RolesAllowed.

Получить user_role в контроллере не проблема, но я не думаю, что это хорошая идея проверить роль пользователя в каждой функции.

Или, может быть, есть лучшее решение, чем использование @RolesAllowed?

Извините за глупый вопрос, это 5 часов, так как я видел весну в первый раз.

ответ

2

Вы не указали подробностей в архитектуре приложения, которое вы строите, но в качестве стартера я могу дать вам несколько образцов из той, которую я сейчас создаю. Я использую Spring Boot, JPA, Spring Data и Spring Security. У меня было аналогичное требование, и я решил это так:

Я реализовал интерфейс UserDetailsService. Он используется для извлечения информации о пользователе, который пытается войти в систему. Поскольку я использую JPA и Spring Data, классы обслуживания и модели выглядят примерно так (getters, seters и большинство удаленных полей для краткости):

@Entity 
// in your case this would map to the User table 
public class Profile implements UserDetails { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    // you should probably use bean validation/jpa to assure uniqueness etc. 
    private String name; 
    ... 

    @ElementCollection(fetch = FetchType.EAGER) 
    private Set<Role> roles = ImmutableSet.<Role> of(new Role("USER")); 
    ... 
} 

@Embeddable 
// in your case this would map to the user_role table 
public class Role implements GrantedAuthority { 

    public final static Role USER = new Role("USER"); 
    public final static Role ADMIN = new Role("ADMIN"); 

    private String authority; 

    ... 

} 

@Transactional 
@Service 
public class ProfileService implements UserDetailsService { 

    private final ProfileRepository profileRepository; 

    @Autowired 
    public ProfileService(ProfileRepository profileRepository){ 
      this.profileRepository = profileRepository; 
    } 

    public Profile loadUserByUsername(String username) throws UsernameNotFoundException { 
     Profile profile = profileRepository.findByUsername(username); 

     // this is the only way to authenticate 
     if (profile == null) { 
      throw new UsernameNotFoundException("security.userNotFound"); 
     } 

     return profile; 
    } 

// you may want to add profile creation etc. 
... 
} 

Как только я установил эту настройку, мне пришлось настроить Spring Security для использования этой службы. В основном я использую Java Config, поэтому конфигурация выглядит примерно так.

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired 
    private ProfileService profileService; 

    @Bean 
    public PasswordEncoder passwordEncoder() { 
     return new BCryptPasswordEncoder(); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 
     auth.userDetailsService(profileService).passwordEncoder(passwordEncoder()); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
       .authorizeRequests() 
       .antMatchers(HttpMethod.POST, "/**") 
       .authenticated() 
       ... 
       // you may want to put more config here 
     } 
} 
Смежные вопросы