【发布时间】:2015-12-16 17:57:20
【问题描述】:
我是第一次尝试 Spring Security,但由于某种原因,我编写的身份验证机制没有触发 -
使用的技术 - Spring 4.2.1、spring-security、jetty container、jersey 和 couchbase DB
SecurityConfig.java -
@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses={UserRepository.class, MyUserDetailService.class})
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
// For later
//
// http.authorizeRequests().antMatchers("/*")
// .access("hasRole('ROLE_ADMIN')");
}
@Bean
public PasswordEncoder passwordEncoder(){
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
SecurityWebAppInitializer.java -
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(SecurityConfig.class);
}
}
UserDetailService.java -
@Service("userDetailsService")
public class MyUserDetailService extends BaseServiceImpl<com.scoolboard.rest.entity.User, String> implements UserDetailsService {
@Autowired
private UserRepository userRepository;
protected UserRepository getRepository() {
return userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
com.scoolboard.rest.entity.User user = getRepository().findByUserEmail(username);
List<GrantedAuthority> authorities = buildUserAuthority(new HashSet<UserRole>(user.getUserRole()));
return buildUserForAuthentication(user, authorities);
}
// Converts com.mkyong.users.model.User user to
// org.springframework.security.core.userdetails.User
private User buildUserForAuthentication(com.scoolboard.rest.entity.User user,
List<GrantedAuthority> authorities) {
return new User(user.getEmail(), user.getPassword(),
user.isEnabled(), true, true, true, authorities);
}
private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRole userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
List<GrantedAuthority> result = new ArrayList<GrantedAuthority>(setAuths);
return result;
}
}
我在这里错过了什么。
【问题讨论】:
-
你启用了spring log并检查了吗?我看不出配置有任何问题
-
1.您使用的是 servlet api 3 吗? 2. 你的容器支持吗? (可能会覆盖到2.5) 3、SecurityWebApplicationInitializer的构造函数是否执行? 4. 停止其中一种控制器方法的调试器,并检查您是否在堆栈跟踪中看到安全过滤器。
标签: java spring authentication spring-security