SpringSecurity增加额外登录参数

参考连接 自定义认证逻辑的两种方式(高级玩法)

我的需求是需要在传多个参数,从数据库中查询

自定义UsernamePasswordAuthenticationFilter

/**
 * @author Junisyoan
 * @date 2021年2月23日
 * 验证登录用户密码
 */
public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
	
	...//省略

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {

        if (request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)
                || request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)
        ) {
            ObjectMapper mapper = new ObjectMapper();
            UsernamePasswordAuthenticationToken authRequest;
            try {
                InputStream is = request.getInputStream();
                @SuppressWarnings("unchecked")
                Map<String, String> authenticationBean = mapper.readValue(is, Map.class);

                String username = authenticationBean.get("username");
                String password = authenticationBean.get("password").trim();


				//额外参数
                String enterpriseCode = authenticationBean.get("enterpriseCode");



                authRequest = new CustomUsernamePasswordAuthenticationToken(username,password,enterpriseCode);
                super.setDetails(request, authRequest);
            } catch (IOException e) {
                e.printStackTrace();
                authRequest = new UsernamePasswordAuthenticationToken("", "");
            }
            return authenticationManager.authenticate(authRequest);
        } else {
            return super.attemptAuthentication(request, response);
        }
    }
	...//省略

}


自定义 UsernamePasswordAuthenticationToken

/**
 * @author shangchain Junisyoan
 * 2021/8/9
 * 自定义认证token
 */
public class CustomUsernamePasswordAuthenticationToken extends UsernamePasswordAuthenticationToken {

    /**
     * 企业编码
     */
    private final String enterpriseCode;

    public CustomUsernamePasswordAuthenticationToken(Object principal, Object credentials, String enterpriseCode) {
        super(principal, credentials);
        this.enterpriseCode = enterpriseCode;
    }

    public String getEnterpriseCode() {
        return enterpriseCode;
    }
}

自定义AbstractUserDetailsAuthenticationProvider这里主要是重写retrieveUser方法,从数据库中查数据,其他的从DaoAuthenticationProvider抄的


/**
 * @author Junisyoan
 * 2021/8/9
 * 客户端自定义登录验证
 */

public class ClientLoginAuthProvider extends AbstractUserDetailsAuthenticationProvider {

    ...//省略代码
    
    @Override
    protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
        CustomUsernamePasswordAuthenticationToken auth = (CustomUsernamePasswordAuthenticationToken) authentication;
        
        //多个参数
        UserDetails loadedUser = userDetailsService.loadUserByUsername(username,auth.getEnterpriseCode());
        
        if (loadedUser == null) {
            throw new InternalAuthenticationServiceException(
                    "UserDetailsService returned null, which is an interface contract violation");
        }
        return loadedUser;
    }

	...//省略代码

}

最后覆盖原有的provider


/**
 * @author Junisyoan
 *
 */
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	//..
	
    @Bean
    public ClientLoginAuthProvider provider(){
        ClientLoginAuthProvider provider = new ClientLoginAuthProvider(userService);
        provider.setPasswordEncoder(passwordEncoder());
        return provider;
    }

    @Bean(name = BeanIds.AUTHENTICATION_MANAGER)
    @Override
    public AuthenticationManager authenticationManagerBean() {
        return new ProviderManager(Collections.singletonList(provider()));
    }
    
    //...
}


运行结果

2021-08-09 18:16:37 JRebel: Reloading SQL maps
c.s.s.a.filter.JwtAuthenticationFilter   : 认证令牌 ===> null
c.s.s.s.s.impl.ClientUserServiceImpl     : 开始认证用户:admin

这里只会有一次认证,多次认证就是SecurityConfig配置错了

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Spring Security中进行登录验证并获取参数的方法可以通过自定义过滤器来实现。在SecurityConfig配置类中,我们可以配置自定义的过滤器链,并将其加入到Spring容器中。 首先,在自定义的过滤器中,我们可以通过重写doFilter方法来获取登录验证的参数。在该方法中,可以通过request对象来获取表单的学校id参数。例如,可以使用request.getParameter("schoolId")来获取学校id参数的值。 接下来,在SecurityConfig配置类中,我们需要定义一个SpringSecurity的配置类,并继承WebSecurityConfigurerAdapter。在这个配置类中,我们可以使用@Configuration注解来标识这是一个配置类,并通过@Bean注解将自定义的过滤器加入到Spring容器中。同时,可以通过@Bean注解将BCryptPasswordEncoder加入到容器中,用于对密码进行加密和验证。 综上所述,通过自定义过滤器和配置类,我们可以实现在Spring Security中进行登录验证并获取参数的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring Security 登录时如何获取其他参数(可用作校验验证码)](https://blog.csdn.net/qq_31279347/article/details/88894491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [清晰搞懂Spring Security登录认证](https://blog.csdn.net/Aqting/article/details/125857193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值