springboot 集成 spring secutity 使用role角色时的小坑

作者在使用角色权限过滤时遇到问题,将接口设置为仅admin角色可访问,但gao用户(admin角色)访问一直报权限不足。后找到解决办法,在数据库存储用户角色时,要以ROLE_开头存储,这是Spring Boot集成Spring Security的默认设置,使用hasAuthority()则无此问题。

当使用角色的权限过滤时,碰到了一点小问题.

@Component
public class MyUserDetailService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
        //模拟数据库查询用户
        Map map = Constant.getMap.get();
        UserInfo user = (UserInfo) map.get(name);
        if (user == null) {
            throw new UsernameNotFoundException("用户名不存在");
        }
        return user;
    }
}
public class Constant {
    public static class getMap {
        private static Map map;

        public static Map get() {
            if (map == null) {
                map = new HashMap();
            }
            map.put("gao", new UserInfo() {{
                setId(1L);
                setPassword(new BCryptPasswordEncoder().encode("123"));
                setUserName("gao");
                List list = new ArrayList<>();
                list.add("admin");
                setRoles(list);
            }});
            map.put("yang", new UserInfo() {
                {
                    setId(2L);
                    setPassword(new BCryptPasswordEncoder().encode("321"));
                    setUserName("yang");
                    List list = new ArrayList<>();
                    list.add("guest");
                    setRoles(list);
                }
            });
            return map;
        }
    }
}

       上面是我写死的数据,根据用户名得到了用户角色,gao这个用户是admin这个角色,我将一个接口也设置为了只能admin这个角色用户可以访问,但是一直报权限不足;遂各种找原因,然后再网上看到了解决办法...

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .httpBasic().authenticationEntryPoint(notLogin)
                .and()
                .formLogin()
                .successHandler(loginSuccesssHandler)
                .failureHandler(loginFailHandler)
                .permitAll()

                .and()
                .authorizeRequests()
                .antMatchers("/open")
                .permitAll()
                .antMatchers("/index")
                .access("hasRole('admin')")
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated();
        http.exceptionHandling().accessDeniedHandler(deniedHandler);
        http.addFilterBefore(myFilter, UsernamePasswordAuthenticationFilter.class);
    }

这里权限设置中心里的hasRole这里依然不用动,就是保持admin,但是我们需要在数据库存储用户角色时,要存为以ROLE_为开通u的数据,这样就可以了.这个是springboot继承springsecutity默认的设置.

list.add("ROLE_admin");

当然如果使用的是hasAuthority(),那么就没有这个问题;

你想了解如何在Spring集成Spring Security,并且使用Bootstrap 4.0.0-beta CSS库来美化前端页面,是吗? 首先,你需要确保你的Spring项目中已经添加了Spring Security依赖。你可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>5.5.1</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>5.5.1</version> </dependency> ``` 接下来,你可以创建一个Spring Security配置类来定义安全规则和访问控制。以下是一个简单的配置类示例: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("user").password("{noop}password").roles("USER"); } } ``` 在上面的配置类中,我们定义了访问规则和认证方式。我们允许所有用户访问`/public`路径下的资源,并且要求其他路径需要进行身份验证后才能访问。我们还定义了一个用户`user`,密码为`password`,并赋予了`USER`角色。 接下来,你可以在你的前端页面中引入Bootstrap 4.0.0-beta的CSS文件,以美化你的页面。你可以在HTML文件中添加以下代码: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Spring Security with Bootstrap 4.0.0-beta</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css"> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="#">Spring Security</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="/">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="/public/about">About</a> </li> <li class="nav-item"> <a class="nav-link" href="/login">Login</a> </li> </ul> </div> </nav> <div class="container mt-5"> <h1>Welcome to Spring Security with Bootstrap 4.0.0-beta</h1> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod eu lorem et ultricies. In porta lorem at dui semper porttitor. Nullam quis cursus dui. Cras tincidunt vehicula tellus eu facilisis. Donec nisi turpis, iaculis et arcu a, aliquet ultrices nisl. Nam in pharetra odio, ac blandit metus. Suspendisse potenti. Praesent elementum diam non orci cursus rutrum. Pellentesque condimentum ultrices dignissim. Sed a tempor ligula, vel luctus sapien.</p> </div> </body> </html> ``` 在上面的HTML代码中,我们引入了Bootstrap 4.0.0-beta的CSS文件,并使用了其中的一些样式来美化页面,例如导航栏和容器。你可以根据自己的需要来使用Bootstrap中的其他样式。 希望这能够帮助你集成Spring Security并美化你的前端页面!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值