spring boot security 自定义登陆、成功处理、失败处理

spring security 自定义登录,推荐文章地址:https://www.jianshu.com/p/779d3071e98d

 

附加信息项,自定义登录成功与失败

定义自定义成功处理类,继承SavedRequestAwareAuthenticationSuccessHandler  

@Component("myAuthenctiationSuccessHandler")
public class MyAuthenctiationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler  {
	private Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	private ObjectMapper objectMapper;

	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
			throws IOException, ServletException {
		logger.info("登录成功");
		response.setContentType("application/json;charset=UTF-8");
		response.getWriter().write( objectMapper.writeValueAsString(authentication));
	}
}

 

定义自定义失败处理类 继承 SimpleUrlAuthenticationFailureHandler

@Component("myAuthenctiationFailureHandler")
public class MyAuthenctiationFailureHandler extends SimpleUrlAuthenticationFailureHandler  {
	private Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	private ObjectMapper objectMapper;

	@Override
	public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
			throws IOException, ServletException {
		logger.info("进入认证失败处理类");
//		response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
		response.setContentType("application/json;charset=UTF-8");
		//转发到login
//		request.getRequestDispatcher("/login?error="+exception.getMessage()).forward(request, response);
		
		response.sendRedirect("/login?error="+objectMapper.writeValueAsString(exception.getMessage())); 
		return;
	}
}

 

将自定义处理类加入配置

注意:

网上默认添加认证成功处理类在我们自己定义的安全配置类中  BrowerSecurityConfig extends WebSecurityConfigurerAdapter

configure 方法中设置添加

    @Autowired
    MyAuthenctiationSuccessHandler myAuthenctiationSuccessHandler;		//认证成功处理类
    @Autowired
    MyAuthenctiationFailureHandler myAuthenctiationFailureHandler;		//认证失败处理类

	@Override
    protected void configure(HttpSecurity http) throws Exception {

        http.formLogin()                    //  定义当需要用户登录时候,转到的登录页面。
            .loginPage("/login")          // 设置登录页面
            .successHandler(myAuthenctiationSuccessHandler) // 自定义登录成功处理 
            .failureHandler(myAuthenctiationFailureHandler); // 自定义登录失败处理
        ... 此处省略不关键代码
}

当我们使用了自定义过滤器(BhAuthenticationFilter 继承至 AbstractAuthenticationProcessingFilter)开头链接文章有讲解如何自定义过滤器,自定义登录等。

 

使用自定义过滤器后在configure 方法中的http 设置了自定义登录成功与登录失败处理(如上) 不生效

解决办法:需要定义 filter的bean上设置。

例如:

    @Bean
    public BhAuthenticationFilter bhAuthenticationFilter() {
        BhAuthenticationFilter filter = new BhAuthenticationFilter();
        filter.setAuthenticationManager(authenticationManager);
        filter.setAuthenticationFailureHandler(myAuthenctiationFailureHandler); //处理失败
        filter.setAuthenticationSuccessHandler(myAuthenctiationSuccessHandler); //处理成功
        return filter;
    }

学习spring security 遇到的坑,仅供参考。

 

 

 

 

自定义Spring Boot Security的认证过程,您需要实现`UserDetailsService`接口来加载用户信息并验证其凭据。您可以在您的Security配置类中覆盖`configure(AuthenticationManagerBuilder auth)`方法来设置`UserDetailsService`,如下所示: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private MyUserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("ADMIN", "USER") .antMatchers("/**").permitAll() .and() .formLogin() .and() .logout().logoutSuccessUrl("/login"); } } ``` 在这里,我们使用`MyUserDetailsService`类作为我们的`UserDetailsService`实现。您需要创建此类并实现`loadUserByUsername`方法,该方法将从数据库或其他存储中加载用户信息并返回一个`UserDetails`对象。在这个`UserDetails`对象中,您可以指定用户的密码,角色和权限等详细信息。 ```java @Service public class MyUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found with username: " + username); } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user)); } private Collection<? extends GrantedAuthority> getAuthorities(User user) { List<GrantedAuthority> authorities = new ArrayList<>(); for (Role role : user.getRoles()) { authorities.add(new SimpleGrantedAuthority(role.getName())); for (Permission permission : role.getPermissions()) { authorities.add(new SimpleGrantedAuthority(permission.getName())); } } return authorities; } } ``` 在这里,我们使用`UserRepository`类从数据库中加载用户信息。在`loadUserByUsername`方法中,我们从数据库中获取用户信息并返回一个`UserDetails`对象。在`getAuthorities`方法中,我们为用户添加了角色和权限。 这是一个基本的示例,您可以根据您的需求进行更改和扩展。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值