集成security后启动时报错如下图
package com.xjc.leleservice.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xjc.common.untils.JwtToken;
import com.xjc.common.untils.ResultUtils;
import com.xjc.entity.AdminUser;
import com.xjc.ldao.mapper.AdminUserMapper;
import com.xjc.leleservice.AdminUserService;
import com.xjc.vo.AdminUserLoginParamVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@Service
public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser> implements AdminUserService {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private JwtToken jwtToken;
@Value("${jwt.tokenHeader}")
private String tokenHeader;
@Autowired
private AdminUserMapper adminUserMapper;
@Override
public ResultUtils login(AdminUserLoginParamVO adminUserLoginParamVO, HttpServletRequest request) {
//登录
UserDetails userDetails = userDetailsService.loadUserByUsername(adminUserLoginParamVO.getUsername());
if(null==userDetails||!passwordEncoder.matches(adminUserLoginParamVO.getPassword(), userDetails.getUsername())){
return new ResultUtils("207", "用户名或密码错误");
}
//更新登录对象
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//获取token
String token = jwtToken.generateToken(userDetails);
Map result = new HashMap();
result.put("token", token);
result.put("tokenHeader", tokenHeader);
return new ResultUtils(request, "登录成功");
}
/**
* 根据用户名获取用户
* @param userName
* @return
*/
@Override
public AdminUser getAdminUser(String userName) {
QueryWrapper<AdminUser> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_name", userName);
AdminUser adminUser = adminUserMapper.selectOne(queryWrapper);
return adminUser;
}
}
SecurityConfig
package com.xjc.websecurity;
import com.xjc.common.handler.RestAuthorizationEntryPoint;
import com.xjc.common.handler.RestfulAccessDeniedHandler;
import com.xjc.entity.AdminUser;
import com.xjc.leleservice.AdminUserService;
import com.xjc.leleservice.filter.JwtAuthencationTokenFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AdminUserService adminUserService;
@Autowired
private RestAuthorizationEntryPoint restAuthorizationEntryPoint;
@Autowired
private RestfulAccessDeniedHandler restfulAccessDeniedHandler;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
//基于token不需要session
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
//允许登录
.antMatchers("/login","/loginOut")
.permitAll()
//其余的全部拦截
.anyRequest()
.authenticated()
.and()
.headers()
.cacheControl();
//添加jwt拦截过滤器
http.addFilterBefore(jwtAuthencationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
//添加自定义未授权和未登录结果返回
http.exceptionHandling()
.accessDeniedHandler(restfulAccessDeniedHandler)
.authenticationEntryPoint(restAuthorizationEntryPoint);
}
@Bean
@Override
public UserDetailsService userDetailsService(){
return username -> {
AdminUser adminUser = adminUserService.getAdminUser(username);
if(adminUser!=null){
return adminUser;
}
return null;
};
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
public JwtAuthencationTokenFilter jwtAuthencationTokenFilter(){
return new JwtAuthencationTokenFilter();
}
}
感觉没啥问题啊这个咋解决
你没发现你这个逻辑的问题?
AdminUserServiceImpl里面那一堆认证逻辑全删了,你那里只要做查询,不需要你画蛇添足去做这些
请问你这个问题怎么解决的呀?也遇到了
请问这个问题解决了?我也遇到这个问题,好几天了,就是弄不好
加个@Lazy
我的目前已经解决了。个人见解,不对请见谅:b站上教的云e办使用的springboot是2.3.x的,目前是2022年2月份,springboot已经更新到2.6.x了。我百度了一下,网上说springboot2.6.x 默认情况完全禁止Bean的循环引用。因此可能在创建springboot父工程的pom的时候,引入的版本过高,手动指定springboot的版本。
父工程的pom文件
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE
还有,父工程的pom依赖改了后,子工程的pom文件的parent标签的也要更改
子工程pom文件
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE