<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      spring-security實現的token授權

      在我的用戶密碼授權文章里介紹了spring-security的工作過程,不了解的同學,可以先看看用戶密碼授權這篇文章,在
      用戶密碼授權模式里,主要是通過一個登陸頁進行授權,然后把授權對象寫到session里,它主要用在mvc框架里,而對于webapi來說,一般不會采用這種方式,對于webapi
      來說,一般會用jwt授權方式,就是token授權碼的方式,每訪問api接口時,在http頭上帶著你的token碼,而大叔自己也寫了一個簡單的jwt授權模式,下面介紹一下。

      WebSecurityConfig授權配置

      @Configuration
      @EnableWebSecurity
      @EnableGlobalMethodSecurity(prePostEnabled = true)
      public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter {
        /**
         * token過濾器.
         */
        @Autowired
        LindTokenAuthenticationFilter lindTokenAuthenticationFilter;
      
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
          return super.authenticationManagerBean();
        }
      
        @Override
        protected void configure(HttpSecurity httpSecurity) throws Exception {
          httpSecurity
              .csrf().disable()
              // 基于token,所以不需要session
              .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
              .authorizeRequests()
              // 對于獲取token的rest api要允許匿名訪問
              .antMatchers("/lind-auth/**").permitAll()
              // 除上面外的所有請求全部需要鑒權認證
              .anyRequest().authenticated();
          httpSecurity
              .addFilterBefore(lindTokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
          // 禁用緩存
          httpSecurity.headers().cacheControl();
        }
      
        /**
         * 密碼生成策略.
         *
         * @return
         */
        @Bean
        public PasswordEncoder passwordEncoder() {
          return new BCryptPasswordEncoder();
        }
      }
      
      

      授權接口login

      對外開放的,需要提供用戶名和密碼為參數進行登陸,然后返回token碼,當然也可以使用手機號和驗證碼登陸,授權邏輯是一樣的,獲取用戶信息都是使用UserDetailsService,
      然后開發人員根據自己的業務去重寫loadUserByUsername來獲取用戶實體。

      用戶登陸成功后,為它授權及認證,這一步我們會在redis里建立token與用戶名的關系。

      @GetMapping(LOGIN)
        public ResponseEntity<?> refreshAndGetAuthenticationToken(
            @RequestParam String username,
            @RequestParam String password) throws AuthenticationException {
          return ResponseEntity.ok(generateToken(username, password));
        }
      
        /**
         * 登陸與授權.
         *
         * @param username .
         * @param password .
         * @return
         */
        private String generateToken(String username, String password) {
          UsernamePasswordAuthenticationToken upToken = new UsernamePasswordAuthenticationToken(username, password);
          // Perform the security
          final Authentication authentication = authenticationManager.authenticate(upToken);
          SecurityContextHolder.getContext().setAuthentication(authentication);
          // Reload password post-security so we can generate token
          final UserDetails userDetails = userDetailsService.loadUserByUsername(username);
          // 持久化的redis
          String token = CommonUtils.encrypt(userDetails.getUsername());
          redisTemplate.opsForValue().set(token, userDetails.getUsername());
          return token;
        }
      

      LindTokenAuthenticationFilter代碼

      主要實現了對請求的攔截,獲取http頭上的Authorization元素,token碼就在這個鍵里,我們的token都是采用通用的Bearer開頭,當你的token沒有過期時,會
      存儲在redis里,key就是用戶名的md5碼,而value就是用戶名,當拿到token之后去數據庫或者緩存里拿用戶信息進行授權即可。

      /**
       * token filter bean.
       */
      @Component
      public class LindTokenAuthenticationFilter extends OncePerRequestFilter {
      
        @Autowired
        RedisTemplate<String, String> redisTemplate;
        String tokenHead = "Bearer ";
        String tokenHeader = "Authorization";
        @Autowired
        private UserDetailsService userDetailsService;
      
        /**
         * token filter.
         *
         * @param request     .
         * @param response    .
         * @param filterChain .
         */
        @Override
        protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {
      
          String authHeader = request.getHeader(this.tokenHeader);
          if (authHeader != null && authHeader.startsWith(tokenHead)) {
            final String authToken = authHeader.substring(tokenHead.length()); // The part after "Bearer "
            if (authToken != null && redisTemplate.hasKey(authToken)) {
              String username = redisTemplate.opsForValue().get(authToken);
              if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
                //可以校驗token和username是否有效,目前由于token對應username存在redis,都以默認都是有效的
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                    userDetails, null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(
                    request));
                logger.info("authenticated user " + username + ", setting security context");
                SecurityContextHolder.getContext().setAuthentication(authentication);
              }
            }
          }
      
          filterChain.doFilter(request, response);
      
        }
      

      測試token授權

      get:http://localhost:8080/lind-demo/login?username=admin&password=123
      
      post:http://localhost:8080/lind-demo/user/add
      Content-Type:application/json
      Authorization:Bearer 21232F297A57A5A743894A0E4A801FC3
      
      posted @ 2019-03-15 17:49  張占嶺  閱讀(40671)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 午夜精品国产自在| 中文字幕一区二区三区麻豆| 国产毛1卡2卡3卡4卡免费观看| 精品人妻码一区二区三区| 欧美日韩在线第一页免费观看| 一区二区三区鲁丝不卡| 亚洲一区二区三区播放 | 欧美亚洲另类制服卡通动漫 | 国产成人综合95精品视频| 在线观看亚洲欧美日本| 成人精品视频一区二区三区| 成人自拍小视频免费观看| 国产不卡一区在线视频| 国产亚洲精品97在线视频一| 一区二区三区四区高清自拍| 亚洲蜜桃av一区二区三区| 永久黄网站色视频免费直播| 久久亚洲国产五月综合网| 在国产线视频A在线视频| 婷婷色综合视频在线观看| 风韵丰满熟妇啪啪区老老熟妇| 日韩人妻少妇一区二区三区| 少妇大叫太大太爽受不了| 国产激情av一区二区三区| 日韩国产精品中文字幕| 国产日产欧产美韩系列麻豆| 国产三级国产精品国产专| 高潮迭起av乳颜射后入| 国产亚洲一区二区三不卡| 亚洲一区二区精品动漫| 国产一区二区在线观看粉嫩| 亚洲尤码不卡av麻豆| 四虎影视国产精品永久在线| 91中文字幕在线一区| 亚洲熟妇无码av另类vr影视| 亚洲有无码中文网| 92国产精品午夜福利免费| 国产一区二区一卡二卡| 亚洲 一区二区 在线| 久久亚洲精品11p| 成在线人永久免费视频播放|