我是spring security的新手,尝试在spring boot rest服务上实现基本身份验证。我使用基于数据库的身份验证,并具有用户和角色表。当我向我的应用程序中的任何具有正确凭据的控制器发出请求时,它总是给我403禁止。我不明白为什么。我多次检查角色是否正确。在数据库中,角色名是“USER”、“RESTAURANT”和“ADMIN”。我尝试了ROLE\uPrefix和独立大写语法,但两种方法都不起作用。不知道我做错了什么。这是我的配置类:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled=true,jsr250Enabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Autowired
private UserDetailsService customUserDetailsService;
@Autowired
private AuthenticationEntryPoint authEntryPoint;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception
{
auth.userDetailsService(customUserDetailsService)
.passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.httpBasic()
.authenticationEntryPoint(authEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/user/register","/forgotPassword").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
;
}
}
以下是我的UserDetailService实现:
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
User user = userRepository.findByUsername(username);
System.out.println(user.toString()); //here i check if it's finding right user
if (user == null) {
throw new UsernameNotFoundException(username +" not found");
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user));
}
private static Collection<? extends GrantedAuthority> getAuthorities(User user)
{
String[] userRoles = user.getRoles()
.stream()
.map((role) -> role.getName())
.toArray(String[]::new);
Collection<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(userRoles);
return authorities;
}
}
这是我的一个控制器,返回403:
@PreAuthorize("hasRole('USER')")
//@Secured("USER")
@GetMapping("/{restaurantmenu}") //bütün menüyü çeker
Collection<Menu> getMenu(@PathVariable("restaurantmenu") Long id) {
return menuService.getMenuItemsByRestaurant(restaurantService.getRestaurant(id));
}
为了您的信息。我有一个注册url,所以通过json获取新用户并使用加密(Bcrypt)密码将其注册到数据库中,我正在尝试使用该密码进行身份验证。我能够检索新用户并注册到db并正确加密密码。我不知道我是否能够在使用这种方式注册时控制用户名和电子邮件,但如果您关心,这里是响应控制器方法:
@RestController
@RequestMapping(value="/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
void registerUser(@Valid @RequestBody User user) {
userService.save(user);
}
}
每一个帮助和建议将不胜感激。
将角色保存为数据库中的ROLE\u USER、ROLE\u ADMIN并添加特定方法可能会对您有所帮助。
.antMatchers(HttpMethod.POST,"/user/register","/forgotPassword").permitAll()
.antMatchers(HttpMethod.GET,"/restaurantURL").permitAll()
编辑:参考此以获取有关角色的更多详细信息
我是依赖注入的新手,最近不得不学习Spring和Guice。下面的问题可能很蹩脚。 Spring允许您创建带有@scope(“prototype”)注释的原型对象,这意味着每次都会返回一个新对象 例如在我的Spring容器中:- 并在@AutoWired的所有引用中注入一个新对象a。 但是,在guice注入器中,正在注入相同的实例。看起来guice只提供单例、请求或会话作用域https://git
我正在做一些产生正确结果的事情。然而,从设计观点来看,这是错误的。 该程序的重点是列出一个数字的所有幂的结果,直到并包括用户定义的限制。 我有一个构造函数,它接受扫描器中的基和指数。然后是一种利用for循环计算每个指数的幂的方法。 现在,问题是我直接从这个方法打印每个循环迭代的结果。这超过了私有变量的点,它首先是无效的。 因此,我想定义一个getter方法,它将每个幂的结果返回给输出。我过去常常为
我创建了这个函数来计算我要测量的距离: 由于我不明白的原因,距离的值只返回一次。因此,如果我在forEach函数中抛出2个位置,并且在循环中使用console.log,我会看到所有的计算都是正确的。但如果我返回距离的值,则只返回一个值。 如何正确返回值? 我使用VueJS,其中'Distance toResponder'是一个计算属性来填充表: 因此函数应该返回每个响应者的距离。那么我需要如何调整
我创建了一个web app Maven项目,该项目使用RestEasy作为RESTful应用程序框架。 我的文件如下所示: 我已经将自动扫描设置为true,并创建了几个类来满足endpoint访问的需要。 但问题是,我的浏览器抛出“404 not found”,尽管我已经在类中指定了endpoint参数。 示例endpointURL:http://localhost:8080/me.randyta
本文向大家介绍PowerShell函数一次返回多个返回值示例,包括了PowerShell函数一次返回多个返回值示例的使用技巧和注意事项,需要的朋友参考一下 本文介绍在自定义PowerShell函数时,如何让函数返回值,如何接收返回值,如何让不相干的内容不放到返回值数组中。 PowerShell函数体中的任何输出,一般来说,都会以返回值的形式返回给函数调用者。多个输出的内容是放到一个返回值数组中的。
我正在使用SQL Server,数据库中有下表: 到目前为止我尝试了什么(错误的,因为它不计算每个组的平均值,而是计算所有列的总平均值):