Vue与SpringSecurity认证整合-06

         Vue与SpringSecurity整合

         我们要知道springsecurity是一个安全框架,我们在后端的时候没有接触前端,springsecurity引入依赖之后,启动项目会对我们进行拦截,让我们登录,然后我们制定了一个登录页面,也是后端的,我们可以指向我们的登录页面,但是与Vue整合之后,登录页面肯定是在Vue中,但是要如何呢?我们可以用几张图来解释

 这里就是我们当时在后端的时候,我们的登陆页面是他自己的,所以可以随便指向登录页面

问题来了,如果才能让他与Vue整合,我们是无法让后端指向前端的登录页面的,我们这样的行为被称为前后端分离项目,前后端分离,后端只需要响应数据,前端只需要传输数据就可以,我是这样想的,我们点击登录按钮的时候,在后端设置处理登录的url,然后把前端的用户名密码传输到后端处理登录的url内,我们只需要给前端响应登录成功了还是失败了就可以

 直接上代码!!!!

跨域

     首先先需要一个Vue的登录页面,这里随便使用一个form能传输数据就可以,而我们后端也是一样的,准备一个springsecurity的一个工作,这里我们以前是做过的,可以看我springboot的专栏,我们前端和后端是有同源策略的,我们上节也讲过,但是我们的登录处理路径是不存在的,在springsecurity内部

无法进行注解跨域,所以我们来解决一下

package com.xc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CrosConfig {
    @Bean //方法上面
    // @Component 类上面
    public CorsFilter corsFilter(){
        // 跨域配置
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 允许的域名
        // corsConfiguration.addAllowedOrigin("http://localhost:8080");
        corsConfiguration.addAllowedOrigin("http://localhost:8080");// * 代表所有  http://localhost:8080
        // 允许的请求头
        corsConfiguration.addAllowedHeader("*");//
        // 请求方式
        corsConfiguration.addAllowedMethod("*");// get  post put delete
        corsConfiguration.setAllowCredentials(true);
        // 允许携带凭证
        corsConfiguration.addAllowedOriginPattern("*");//

        // 基于请求路径url的跨域源配置
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        // 所有的路径   都能跨域
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);

        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

     记住我们的security的配置,还是需要加入我们的跨域配置

    

 处理器            

        然后我们使用前端可以进行访问一下,我们后端,点击登录按钮,去提交用户名密码到后端,这里记住必须使用post请求才可以 ,这里我们使用的一个插件 qs,我们可以通过npm i qs来下载,他可以将我们的数据,以字符串拼接的方式拼接到路径后面,我们点击提交的话,后端是会给前端响应一个页面的

而我们要做的是登录成功之后给前端响应一个信息,这里我们使用了一个springsecurity的成功处理器以及失败处理器

   private void responseSuccess(HttpServletResponse response,Result result) throws 
  IOException {
        //设置编码格式
        response.setContentType("application/json;charset=utf-8");
        ObjectMapper mapper=new ObjectMapper();
        String s = mapper.writeValueAsString(result);
        PrintWriter writer = response.getWriter();
        writer.println(s);
         writer.flush();
         writer.close();
    }    
@Override
    protected void configure(HttpSecurity http) throws Exception {
        //登录成功的处理器
        http.formLogin().successHandler(new AuthenticationSuccessHandler() {
            @Override
            public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                //登录成功的时候给前端传入一个通知
                responseSuccess(response,Result.success("成功"));
             }
        }).failureHandler(new AuthenticationFailureHandler() {
            @Override
            public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
                responseSuccess(response,Result.fail());
            }
        });
        // 配置登录设置
        http.formLogin().loginProcessingUrl("/mylogin").permitAll()
                .usernameParameter("username").passwordParameter("password");
        http.authorizeRequests().anyRequest().authenticated();// 除了放行之外的其他的路径全部需要认证
        // 由于我们设置的 登录是一个html页面
        http.csrf().disable();
        // 允许跨域
        http.cors();
}

当我们再次访问的时候,只会给我们响应成功还是失败,前端来进行跳转

此刻我们登录就算完成了,在springboot专栏我也写了jwt令牌进行前后端分离的

axios封装

  我们可以对axios进行封装,因为我们一直都是访问8082端口,假如有一万个8082端口,老板让改成8083端口,难道要改一万次吗

  这里我们为什么要使用凭证呢,我们的后端是不认识我们的,虽然第一次登录你登录成功了,但是你每次都要带着你的密码和用户登录,因为你登录一次之后还是不认识你

 axios的响应拦截器,比请求的响应还要早一点,这里可以对数据进行过滤

import axios from 'axios'
let http=axios.create(
   {
	   baseURL:"http://localhost:8082/",
	   // `withCredentials` 表示跨域请求时是否需要使用凭证
	    withCredentials: true // default
   }
 )
 // 添加响应拦截器
 http.interceptors.response.use((response)=> {
     // 2xx 范围内的状态码都会触发该函数。
     // 对响应数据做点什么
	 let data = response.data
		return data
	
     //return response;
   }, function (error) {
     // 超出 2xx 范围的状态码都会触发该函数。
     // 对响应错误做点什么
     return Promise.reject(error);
   });
 export default http

 我们把http导出之后,需要定义成全局的常量让我们使用

  $http就是http,并且是全局的变量

 

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值