spring security 自定义 openid

目标 利用spring security实现与自定义 openid的对接

大概说一些spring security的账户验证的流程(太细的地方我也不清楚)
1. 对未登陆的用户会被AuthenticationProcessingFilter拦截进行处理,这里主要是读取用户的信息(如果是密码登陆就是在这里获取账号(username)和密码(password),如果是openid就可以在这里让用户跳转到openid service)
2. 在Filter中会生成用户的验证的信息Authentication
3. 然后有会有一个providerManager负责管理改filer所需provider,然后循环调用provider的authenticate方法进行用户,对于每一个provider都有一个对应的userDetailsService进行校验(对于密码和账号就在这里验证,对于openid前面在filter中就有一个标志来表示openid验证情况)
4. 然后成功就会调用登陆成功的handle,失败调用失败的handle

这里写图片描述

其中 vilidate respoense到 openIDConsumer是我们可以自己定义的openid的验证方式,还有userDetails也是可以我们自定义

<http>
...
<!--首先在http标签里面注释掉原来的登陆拦截器,然后在这里加入自定义的openidfilter-->
<custom-filter ref="openidLoginFilter" after="PRE_AUTH_FILTER"/>
...
</http>
<!--自定义的拦截器,然后自定义登陆成功与失败的Handle和自定义的provider-->
<beans:bean id="openidLoginFilter"
                class="com.netease.urs.monitor.filter.MySpecialAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager"/>
    <beans:property name="authenticationSuccessHandler"
                        ref="authenticationSuccessHandler"/>
    <
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security提供了很多种身份认证和授权方式,包括基于表单的身份认证、HTTP Basic认证、HTTP Digest认证、OpenID认证、OAuth认证等。其中表单认证是最常用的一种方式,也是最容易被攻击的方式之一。为了增强安全性,我们可以自定义校验方式。 自定义校验方式可以通过继承`WebSecurityConfigurerAdapter`类,重写其中的`configure(HttpSecurity http)`方法,通过`.antMatchers().permitAll()`或`.antMatchers().hasAuthority()`等方法设置不同的URL访问权限,并通过`.formLogin()`方法设置表单认证。 在自定义校验时,我们也可以通过实现`UserDetailsService`接口来获取用户信息,该接口中有一个`loadUserByUsername()`方法,我们可以在该方法中根据用户名查询数据库中的用户信息,并将其转换成Spring Security内部的`UserDetails`对象返回。同时,我们也可以通过实现`AuthenticationProvider`接口来对用户进行自定义校验,该接口中有一个`authenticate()`方法,我们可以在该方法中对用户的用户名和密码进行校验。 下面是一个简单的自定义校验的示例: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .formLogin().loginPage("/login").defaultSuccessUrl("/home").failureUrl("/login?error=true").permitAll() .and() .logout().logoutUrl("/logout").permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` 在该示例中,我们通过重写`configure(HttpSecurity http)`方法设置了对`/login`路径的访问权限为所有人都可以访问,对其他路径的访问权限需要进行身份认证。同时,我们也通过`.formLogin()`方法设置了表单认证,并将登陆页面设置为`/login`,登陆成功后跳转到`/home`页面,登陆失败后跳转到`/login?error=true`页面。在`configure(AuthenticationManagerBuilder auth)`方法中,我们将自定义的`UserDetailsService`实现和密码加密器`BCryptPasswordEncoder`进行了注入,以完成用户身份校验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值