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 安全配置时做错了什么。

感谢阅读,如果有人需要更多信息,请询问我会尽快上传。

这是我的 CustomUserDetailsS​​ervice

@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() 我刚刚添加了 CustomUserDetailsS​​ervice 【参考方案1】:

这是数据库字段中的一个空白空间,带有 .trim() 问题已解决,一个菜鸟错误 sry

【讨论】:

确实很烦人

以上是关于Spring Security 4注解日志失败的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 Spring Security 授权注解?

带有 Spring Security 的 Grails 4 审计日志不记录“演员”

Spring Security

spring boot整合security 4,怎么设置忽略的静态资源?

spring-boot aop 增删改操作日志 实现

添加 global-method-security 命名空间时 Spring 看不到 @Transactional