Spring Security 4注解日志失败
Posted
技术标签:
【中文标题】Spring Security 4注解日志失败【英文标题】:Spring security 4 annotation loging failure 【发布时间】:2016-04-06 17:03:22 【问题描述】:我正在尝试使用 Spring security 4、hibernate 和注释制作一个 Spring 应用程序。 我有两个角色; “管理员”和“操作”。
这是我的 spring 安全配置。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter
@Autowired
@Qualifier("customUserDetailsService")
UserDetailsService userDetailsService;
@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception
auth.userDetailsService(userDetailsService);
@Override
protected void configure(HttpSecurity http) throws Exception
http.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.antMatchers("/admin/**").access("hasRole('ADMIN')")
.antMatchers("reportes/*").access("hasrole('USUARIO')")
.antMatchers("/operario/**").access("hasRole('OPERARIO')")
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.and().formLogin().loginPage("/login")
.usernameParameter("ssoId").passwordParameter("password")
.and().csrf()
.and().exceptionHandling().accessDeniedPage("/Access_Denied");
这是我的控制器
@Controller
public class OperarioController
@Autowired
private Operarioservice operarioService;
@RequestMapping(value = "/operario/inicio", method = RequestMethod.GET)
public ModelAndView inicioOperario()
ModelAndView mav = new ModelAndView("operario/inicio");
//mock
List<Proyecto> proyectos = operarioService.obtenerProyecto(new Operario());
mav.addObject("proyectos",proyectos);
return mav;
这些是数据库角色:
如果我使用“operario”登录,当我尝试访问我的应用程序"localhost:8081/mantenimiento/operario/inicio"
时,我会被拒绝访问。
这是错误的,因为我有用户operario的role_operario。
如果我用账户管理员登录,我可以去"localhost:8081/mantenimiento/admin"
,我已经很好地登录了。
我不知道我在使用 spring 安全配置时做错了什么。
感谢阅读,如果有人需要更多信息,请询问我会尽快上传。
这是我的 CustomUserDetailsService
@Service("customUserDetailsService")
public class CustomUserDetailsService implements UserDetailsService
@Autowired
private UserService userService;
@Transactional(readOnly=true)
public UserDetails loadUserByUsername(String ssoId)
throws UsernameNotFoundException
User user = userService.findBySso(ssoId);
System.out.println("User : "+user);
if(user==null)
System.out.println("User not found");
throw new UsernameNotFoundException("Username not found");
return new org.springframework.security.core.userdetails.User(user.getSsoId(), user.getPassword(),
user.getState().equals("Active"), true, true, true, getGrantedAuthorities(user));
private List<GrantedAuthority> getGrantedAuthorities(User user)
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for(UserProfile userProfile : user.getUserProfiles())
System.out.println("UserProfile : "+userProfile);
authorities.add(new SimpleGrantedAuthority("ROLE_"+userProfile.getType()));
System.out.print("authorities :"+authorities);
return authorities;
我把“ROLE_”放在返回权限之前。
【问题讨论】:
是ROLE_OPERARIO
还是OPERARIO
在您在customUserDetailsService
中构建您的主体后拥有什么? hasRole()
方法可能会导致混淆,因为它会将ROLE_
添加到指定参数之前,如果权限不包含ROLE_
,则返回false,如果是这种情况,您可以改用hasAuthority()
。
我刚刚添加了 CustomUserDetailsService
【参考方案1】:
这是数据库字段中的一个空白空间,带有 .trim() 问题已解决,一个菜鸟错误 sry
【讨论】:
确实很烦人以上是关于Spring Security 4注解日志失败的主要内容,如果未能解决你的问题,请参考以下文章
带有 Spring Security 的 Grails 4 审计日志不记录“演员”