第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Spring Security 入門

標(biāo)簽:
Java
最近看了一些微服务中一些安全认证的代码,感到很懵,很多相关的基础都不是很了解。就想到了大概两年前在慕课网
买的一门课程Spring Security相关的课程,一直没来得及好好学习,借此机会重基础开始学习,并且记录一下学习的
笔记。课程链接如下:
https://coding.imooc.com/learn/list/134.html
1-引入依赖:
使用Spring Security首先需要在项目中引入相关的依赖。我这里创建了一个spring boot的项目。就引入了:
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

当我们引入依赖后,什么都不配置的时候,启动项目会有如下情况:
默认spring security 会保护我们所有的请求,访问任何请求都需要先进行身份认证。进入到一个登陆的页面。
并且在控制台会有打印的密码。
这种情况肯定不符合我们的要求,那我们应该怎么办?
2-覆盖spring securiy的默认配置
对于上面的问题,我们可以覆盖spring securiy的默认配置。
首先我们实现一个Configuration注解的类并且继承WebSecurityConfigurerAdapter:专门做web应用的适配器.
覆盖其方法:
configure(HttpSecurity http) 
http.formLogin()
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated();
上面的配置代表使用表单登录进行身份认证,所有的请求都需要进行身份认证。
3-自定义用户认证逻辑
我们知道了如何覆盖spring securiy的默认配置,接下来就来看看如何自定义用户认证逻辑。
首先我们需要实现UserDetailsService接口,在其loadUserByUsername方法中我们可以自定义用户信息。
比如以下流程:
1-根据用户名去数据库查询用户信息,如密码,是否过期等
2-组装为UserDetails对象然后返回。

spring securiy是一组过滤器,当我们在from表单填入用户名和密码的时候,会进入
UsernamePasswordAuthenticationFilter这个过滤器,它是专门用来处理表单登录请求的过滤器。
这这个过滤器内,它会接收表单传入的用户名和密码,然后进行认证的判断。

我们这里分析一下它是如何进行密码判断的?
首先页面输入了用户名和密码
然后进入了UsernamePasswordAuthenticationFilter过滤器去处理我们的登录请求。
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
      username, password);
// Allow subclasses to set the "details" property
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
在authenticate方法内部它会从UsernamePasswordAuthenticationToken中获取到username,
然后会调用我们自己实现的UserDetailsService来获取用户信息。
UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username);

然后会根据获取的用户信息进行一系列的判断:
preAuthenticationChecks.check(user);
比如是否过期,是否被冻结,这些信息我们都可以存入库中,查询处理返回给UserDetails 。

然后会对密码进行校验:
if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) 
这里会获取页面传入的密码和数据库中保存的密码进行校验。
并且使用了passwordEncoder。
passwordEncoder我们可以自定义,在保存用户密码的时候需要使用passwordEncoder对密码加密然后入库。
@Bean
public PasswordEncoder passwordEncoder(){
    return new BCryptPasswordEncoder();
}
4-个性化用户认证流程
有时候我们需要使用自己的登录页面可以做如下配置:
.loginPage("/free-signIn.html")
.antMatchers("/free-signIn.html").permitAll()
//告诉spring security 在UsernamePasswordAuthenticationFilter去处理我们配置的请求然后去获取用户信息
.loginProcessingUrl("/authentication/form")
.antMatchers(new String[]{"/free-signIn.html","/js/**","/css/**","/img/**",
"/images/**","/fonts/**","/**/favicon.ico"}).permitAll()

可以更加灵活比如:
处理不同类型的请求:
   访问需要保护的html
   访问需要保护的接口。
配置跳转到自定义的controller方法上:
   .loginPage("/authentication/require")

完整代码如下:
//当需要身份认证的时候,跳转到这里
@RequestMapping("/authentication/require")
@ResponseStatus(code = HttpStatus.UNAUTHORIZED)
public SimpleResponse requireAuthentication(HttpServletRequest request, HttpServletResponse response) throws IOException {

    SavedRequest savedRequest=requestCache.getRequest(request,response);
    if(savedRequest != null){
        String targetUrl=savedRequest.getRedirectUrl();
        log.info("引发跳转的请求是:"+targetUrl);
        if(StringUtils.endsWithIgnoreCase(targetUrl,".html")){
            redirectStrategy.sendRedirect(request,response,securityProperties.getBrowser().getLoginPage());
        }
    }

    return new SimpleResponse("访问服务需要身份认证,请引导用户到登录页面");
}


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開(kāi)發(fā)工程師
手記
粉絲
6390
獲贊與收藏
157

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消