日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

@builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证

發(fā)布時(shí)間:2023/12/3 javascript 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.說明

SpringSecurity是一個(gè)用于Java 企業(yè)級應(yīng)用程序的安全框架,主要包含用戶認(rèn)證和用戶授權(quán)兩個(gè)方面.相比較Shiro而言,Security功能更加的強(qiáng)大,它可以很容易地?cái)U(kuò)展以滿足更多安全控制方面的需求,但也相對它的學(xué)習(xí)成本會更高,兩種框架各有利弊.實(shí)際開發(fā)中還是要根據(jù)業(yè)務(wù)和項(xiàng)目的需求來決定使用哪一種.

JWT是在Web應(yīng)用中安全傳遞信息的規(guī)范,從本質(zhì)上來說是Token的演變,是一種生成加密用戶身份信息的Token,特別適用于分布式單點(diǎn)登陸的場景,無需在服務(wù)端保存用戶的認(rèn)證信息,而是直接對Token進(jìn)行校驗(yàn)獲取用戶信息,使單點(diǎn)登錄更為簡單靈活.

二.項(xiàng)目環(huán)境

  • SpringBoot版本:2.1.6

  • SpringSecurity版本: 5.1.5

  • MyBatis-Plus版本: 3.1.0

  • JDK版本:1.8

  • 數(shù)據(jù)表(SQL文件在項(xiàng)目中):數(shù)據(jù)庫中測試號的密碼進(jìn)行了加密,密碼皆為123456

Maven依賴如下:

<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <scope>runtimescope> dependency> <dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> <optional>trueoptional> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-securityartifactId> dependency> <dependency> <groupId>com.baomidougroupId> <artifactId>mybatis-plus-boot-starterartifactId> <version>3.1.0version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>druidartifactId> <version>1.1.6version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-lang3artifactId> <version>3.5version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.2.45version> dependency> <dependency> <groupId>org.springframework.securitygroupId> <artifactId>spring-security-jwtartifactId> <version>1.0.9.RELEASEversion> dependency> <dependency> <groupId>io.jsonwebtokengroupId> <artifactId>jjwtartifactId> <version>0.9.0version> dependency>dependencies>

配置如下:

# 配置端口server: port: 8764spring: # 配置數(shù)據(jù)源 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/sans_security?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource# JWT配置jwt: # 密匙KEY secret: JWTSecret # HeaderKEY tokenHeader: Authorization # Token前綴字符 tokenPrefix: Sans- # 過期時(shí)間 單位秒 1天后過期=86400 7天后過期=604800 expiration: 86400 # 配置不需要認(rèn)證的接口 antMatchers: /index,/login/**,/favicon.ico# Mybatis-plus相關(guān)配置mybatis-plus: # xml掃描,多個(gè)目錄用逗號或者分號分隔(告訴 Mapper 所對應(yīng)的 XML 文件位置) mapper-locations: classpath:mapper/*.xml # 以下配置均有默認(rèn)值,可以不設(shè)置 global-config: db-config: #主鍵類型 AUTO:"數(shù)據(jù)庫ID自增" INPUT:"用戶輸入ID",ID_WORKER:"全局唯一ID (數(shù)字類型唯一ID)", UUID:"全局唯一ID UUID"; id-type: AUTO #字段策略 IGNORED:"忽略判斷" NOT_NULL:"非 NULL 判斷") NOT_EMPTY:"非空判斷" field-strategy: NOT_EMPTY #數(shù)據(jù)庫類型 db-type: MYSQL configuration: # 是否開啟自動駝峰命名規(guī)則映射:從數(shù)據(jù)庫列名到Java屬性駝峰命名的類似映射 map-underscore-to-camel-case: true # 返回map時(shí)true:當(dāng)查詢數(shù)據(jù)為空時(shí)字段返回為null,false:不加這個(gè)查詢數(shù)據(jù)為空時(shí),字段將被隱藏 call-setters-on-nulls: true # 這個(gè)配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時(shí)候可以用 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

三.編寫項(xiàng)目基礎(chǔ)類

Entity,Dao,Service,及等SpringSecurity用戶的Entity,Service類等在這里省略,請參考源碼

編寫JWT工具類

/** * JWT工具類 * @Author Sans * @CreateTime 2019/10/2 7:42 */@Slf4jpublic class JWTTokenUtil { /** * 生成Token * @Author Sans * @CreateTime 2019/10/2 12:16 * @Param selfUserEntity 用戶安全實(shí)體 * @Return Token */ public static String createAccessToken(SelfUserEntity selfUserEntity){ // 登陸成功生成JWT String token = Jwts.builder() // 放入用戶名和用戶ID .setId(selfUserEntity.getUserId()+"") // 主題 .setSubject(selfUserEntity.getUsername()) // 簽發(fā)時(shí)間 .setIssuedAt(new Date()) // 簽發(fā)者 .setIssuer("sans") // 自定義屬性 放入用戶擁有權(quán)限 .claim("authorities", JSON.toJSONString(selfUserEntity.getAuthorities())) // 失效時(shí)間 .setExpiration(new Date(System.currentTimeMillis() + JWTConfig.expiration)) // 簽名算法和密鑰 .signWith(SignatureAlgorithm.HS512, JWTConfig.secret) .compact(); return token; }}

編寫暫無權(quán)限處理類

/** * @Description 暫無權(quán)限處理類 * @Author Sans * @CreateTime 2019/10/3 8:39 */@Componentpublic class UserAuthAccessDeniedHandler implements AccessDeniedHandler{ /** * 暫無權(quán)限返回結(jié)果 * @Author Sans * @CreateTime 2019/10/3 8:41 */ @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception){ ResultUtil.responseJson(response,ResultUtil.resultCode(403,"未授權(quán)")); }}

編寫用戶未登錄處理類

/** * 用戶未登錄處理類 * @Author Sans * @CreateTime 2019/10/3 8:55 */@Componentpublic class UserAuthenticationEntryPointHandler implements AuthenticationEntryPoint { /** * 用戶未登錄返回結(jié)果 * @Author Sans * @CreateTime 2019/10/3 9:01 */ @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception){ ResultUtil.responseJson(response,ResultUtil.resultCode(401,"未登錄")); }}

編寫登錄失敗處理類

/** * @Description 登錄失敗處理類 * @Author Sans * @CreateTime 2019/10/3 9:06 */@Slf4j@Componentpublic class UserLoginFailureHandler implements AuthenticationFailureHandler { /** * 登錄失敗返回結(jié)果 * @Author Sans * @CreateTime 2019/10/3 9:12 */ @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception){ // 這些對于操作的處理類可以根據(jù)不同異常進(jìn)行不同處理 if (exception instanceof UsernameNotFoundException){ log.info("【登錄失敗】"+exception.getMessage()); ResultUtil.responseJson(response,ResultUtil.resultCode(500,"用戶名不存在")); } if (exception instanceof LockedException){ log.info("【登錄失敗】"+exception.getMessage()); ResultUtil.responseJson(response,ResultUtil.resultCode(500,"用戶被凍結(jié)")); } if (exception instanceof BadCredentialsException){ log.info("【登錄失敗】"+exception.getMessage()); ResultUtil.responseJson(response,ResultUtil.resultCode(500,"用戶名密碼不正確")); } ResultUtil.responseJson(response,ResultUtil.resultCode(500,"登錄失敗")); }}

編寫登錄成功處理類

/** * @Description 登錄成功處理類 * @Author Sans * @CreateTime 2019/10/3 9:13 */@Slf4j@Componentpublic class UserLoginSuccessHandler implements AuthenticationSuccessHandler { /** * 登錄成功返回結(jié)果 * @Author Sans * @CreateTime 2019/10/3 9:27 */ @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication){ // 組裝JWT SelfUserEntity selfUserEntity = (SelfUserEntity) authentication.getPrincipal(); String token = JWTTokenUtil.createAccessToken(selfUserEntity); token = JWTConfig.tokenPrefix + token; // 封裝返回參數(shù) Map resultData = new HashMap<>(); resultData.put("code","200"); resultData.put("msg", "登錄成功"); resultData.put("token",token); ResultUtil.responseJson(response,resultData); }}

編寫登出成功處理類

/** * 用戶登出類 * @Author Sans * @CreateTime 2019/10/3 9:42 */@Componentpublic class UserLogoutSuccessHandler implements LogoutSuccessHandler { /** * 用戶登出返回結(jié)果 * 這里應(yīng)該讓前端清除掉Token * @Author Sans * @CreateTime 2019/10/3 9:50 */ @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication){ Map resultData = new HashMap<>(); resultData.put("code","200"); resultData.put("msg", "登出成功"); SecurityContextHolder.clearContext(); ResultUtil.responseJson(response,ResultUtil.resultSuccess(resultData)); }}

四.編寫Security核心類

編寫自定義登錄驗(yàn)證類

/** * 自定義登錄驗(yàn)證 * @Author Sans * @CreateTime 2019/10/1 19:11 */@Componentpublic class UserAuthenticationProvider implements AuthenticationProvider { @Autowired private SelfUserDetailsService selfUserDetailsService; @Autowired private SysUserService sysUserService; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { // 獲取表單輸入中返回的用戶名 String userName = (String) authentication.getPrincipal(); // 獲取表單中輸入的密碼 String password = (String) authentication.getCredentials(); // 查詢用戶是否存在 SelfUserEntity userInfo = selfUserDetailsService.loadUserByUsername(userName); if (userInfo == null) { throw new UsernameNotFoundException("用戶名不存在"); } // 我們還要判斷密碼是否正確,這里我們的密碼使用BCryptPasswordEncoder進(jìn)行加密的 if (!new BCryptPasswordEncoder().matches(password, userInfo.getPassword())) { throw new BadCredentialsException("密碼不正確"); } // 還可以加一些其他信息的判斷,比如用戶賬號已停用等判斷 if (userInfo.getStatus().equals("PROHIBIT")){ throw new LockedException("該用戶已被凍結(jié)"); } // 角色集合 Set authorities = new HashSet<>(); // 查詢用戶角色 List sysRoleEntityList = sysUserService.selectSysRoleByUserId(userInfo.getUserId()); for (SysRoleEntity sysRoleEntity: sysRoleEntityList){ authorities.add(new SimpleGrantedAuthority("ROLE_" + sysRoleEntity.getRoleName())); } userInfo.setAuthorities(authorities); // 進(jìn)行登錄 return new UsernamePasswordAuthenticationToken(userInfo, password, authorities); } @Override public boolean supports(Class> authentication) { return true; }}

編寫自定義PermissionEvaluator注解驗(yàn)證

/** * 自定義權(quán)限注解驗(yàn)證 * @Author Sans * @CreateTime 2019/10/6 13:31 */@Componentpublic class UserPermissionEvaluator implements PermissionEvaluator { @Autowired private SysUserService sysUserService; /** * hasPermission鑒權(quán)方法 * 這里僅僅判斷PreAuthorize注解中的權(quán)限表達(dá)式 * 實(shí)際中可以根據(jù)業(yè)務(wù)需求設(shè)計(jì)數(shù)據(jù)庫通過targetUrl和permission做更復(fù)雜鑒權(quán) * @Author Sans * @CreateTime 2019/10/6 18:25 * @Param authentication 用戶身份 * @Param targetUrl 請求路徑 * @Param permission 請求路徑權(quán)限 * @Return boolean 是否通過 */ @Override public boolean hasPermission(Authentication authentication, Object targetUrl, Object permission) { // 獲取用戶信息 SelfUserEntity selfUserEntity =(SelfUserEntity) authentication.getPrincipal(); // 查詢用戶權(quán)限(這里可以將權(quán)限放入緩存中提升效率) Set permissions = new HashSet<>(); List sysMenuEntityList = sysUserService.selectSysMenuByUserId(selfUserEntity.getUserId()); for (SysMenuEntity sysMenuEntity:sysMenuEntityList) { permissions.add(sysMenuEntity.getPermission()); } // 權(quán)限對比 if (permissions.contains(permission.toString())){ return true; } return false; } @Override public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { return false; }}

編寫SpringSecurity核心配置類

/** * SpringSecurity核心配置類 * @Author Sans * @CreateTime 2019/10/1 9:40 */@Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true) //開啟權(quán)限注解,默認(rèn)是關(guān)閉的public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * 自定義登錄成功處理器 */ @Autowired private UserLoginSuccessHandler userLoginSuccessHandler; /** * 自定義登錄失敗處理器 */ @Autowired private UserLoginFailureHandler userLoginFailureHandler; /** * 自定義注銷成功處理器 */ @Autowired private UserLogoutSuccessHandler userLogoutSuccessHandler; /** * 自定義暫無權(quán)限處理器 */ @Autowired private UserAuthAccessDeniedHandler userAuthAccessDeniedHandler; /** * 自定義未登錄的處理器 */ @Autowired private UserAuthenticationEntryPointHandler userAuthenticationEntryPointHandler; /** * 自定義登錄邏輯驗(yàn)證器 */ @Autowired private UserAuthenticationProvider userAuthenticationProvider; /** * 加密方式 * @Author Sans * @CreateTime 2019/10/1 14:00 */ @Bean public BCryptPasswordEncoder bCryptPasswordEncoder(){ return new BCryptPasswordEncoder(); } /** * 注入自定義PermissionEvaluator */ @Bean public DefaultWebSecurityExpressionHandler userSecurityExpressionHandler(){ DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler(); handler.setPermissionEvaluator(new UserPermissionEvaluator()); return handler; } /** * 配置登錄驗(yàn)證邏輯 */ @Override protected void configure(AuthenticationManagerBuilder auth){ //這里可啟用我們自己的登陸驗(yàn)證邏輯 auth.authenticationProvider(userAuthenticationProvider); } /** * 配置security的控制邏輯 * @Author Sans * @CreateTime 2019/10/1 16:56 * @Param http 請求 */ @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() //不進(jìn)行權(quán)限驗(yàn)證的請求或資源(從配置文件中讀取) .antMatchers(JWTConfig.antMatchers.split(",")).permitAll() //其他的需要登陸后才能訪問 .anyRequest().authenticated() .and() //配置未登錄自定義處理類 .httpBasic().authenticationEntryPoint(userAuthenticationEntryPointHandler) .and() //配置登錄地址 .formLogin() .loginProcessingUrl("/login/userLogin") //配置登錄成功自定義處理類 .successHandler(userLoginSuccessHandler) //配置登錄失敗自定義處理類 .failureHandler(userLoginFailureHandler) .and() //配置登出地址 .logout() .logoutUrl("/login/userLogout") //配置用戶登出自定義處理類 .logoutSuccessHandler(userLogoutSuccessHandler) .and() //配置沒有權(quán)限自定義處理類 .exceptionHandling().accessDeniedHandler(userAuthAccessDeniedHandler) .and() // 開啟跨域 .cors() .and() // 取消跨站請求偽造防護(hù) .csrf().disable(); // 基于Token不需要session http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 禁用緩存 http.headers().cacheControl(); // 添加JWT過濾器 http.addFilter(new JWTAuthenticationTokenFilter(authenticationManager())); }}

五.編寫JWT攔截類

編寫JWT接口請求校驗(yàn)攔截器

/** * JWT接口請求校驗(yàn)攔截器 * 請求接口時(shí)會進(jìn)入這里驗(yàn)證Token是否合法和過期 * @Author Sans * @CreateTime 2019/10/5 16:41 */@Slf4jpublic class JWTAuthenticationTokenFilter extends BasicAuthenticationFilter { public JWTAuthenticationTokenFilter(AuthenticationManager authenticationManager) { super(authenticationManager); } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 獲取請求頭中JWT的Token String tokenHeader = request.getHeader(JWTConfig.tokenHeader); if (null!=tokenHeader && tokenHeader.startsWith(JWTConfig.tokenPrefix)) { try { // 截取JWT前綴 String token = tokenHeader.replace(JWTConfig.tokenPrefix, ""); // 解析JWT Claims claims = Jwts.parser() .setSigningKey(JWTConfig.secret) .parseClaimsJws(token) .getBody(); // 獲取用戶名 String username = claims.getSubject(); String userId=claims.getId(); if(!StringUtils.isEmpty(username)&&!StringUtils.isEmpty(userId)) { // 獲取角色 List authorities = new ArrayList<>(); String authority = claims.get("authorities").toString(); if(!StringUtils.isEmpty(authority)){ ListString, for(Map<String,String> role : authorityMap){ if(!StringUtils.isEmpty(role)) { authorities.add(new SimpleGrantedAuthority(role.get("authority"))); } } } //組裝參數(shù) SelfUserEntity selfUserEntity = new SelfUserEntity(); selfUserEntity.setUsername(claims.getSubject()); selfUserEntity.setUserId(Long.parseLong(claims.getId())); selfUserEntity.setAuthorities(authorities); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(selfUserEntity, userId, authorities); SecurityContextHolder.getContext().setAuthentication(authentication); } } catch (ExpiredJwtException e){ log.info("Token過期"); } catch (Exception e) { log.info("Token無效"); } } filterChain.doFilter(request, response); return; }}

六.權(quán)限注解和hasPermission權(quán)限擴(kuò)展

Security允許我們在定義URL方法訪問所應(yīng)有的注解權(quán)限時(shí)使用SpringEL表達(dá)式,在定義所需的訪問權(quán)限時(shí)如果對應(yīng)的表達(dá)式返回結(jié)果為true則表示擁有對應(yīng)的權(quán)限,反之則沒有權(quán)限,會進(jìn)入到我們配置的UserAuthAccessDeniedHandler(暫無權(quán)限處理類)中進(jìn)行處理.這里舉一些例子,代碼中注釋有對應(yīng)的描述.

/** * 管理端信息 * @Author Sans * @CreateTime 2019/10/2 14:22 * @Return Map 返回?cái)?shù)據(jù)MAP */ @PreAuthorize("hasRole('ADMIN')") @RequestMapping(value = "/info",method = RequestMethod.GET) public Map<String,Object> userLogin(){ Map<String,Object> result = new HashMap<>(); SelfUserEntity userDetails = SecurityUtil.getUserInfo(); result.put("title","管理端信息"); result.put("data",userDetails); return ResultUtil.resultSuccess(result); } /** * 擁有ADMIN或者USER角色可以訪問 * @Author Sans * @CreateTime 2019/10/2 14:22 * @Return Map 返回?cái)?shù)據(jù)MAP */ @PreAuthorize("hasAnyRole('ADMIN','USER')") @RequestMapping(value = "/list",method = RequestMethod.GET) public Map<String,Object> list(){ Map<String,Object> result = new HashMap<>(); List sysUserEntityList = sysUserService.list(); result.put("title","擁有用戶或者管理員角色都可以查看"); result.put("data",sysUserEntityList); return ResultUtil.resultSuccess(result); } /** * 擁有ADMIN和USER角色可以訪問 * @Author Sans * @CreateTime 2019/10/2 14:22 * @Return Map 返回?cái)?shù)據(jù)MAP */ @PreAuthorize("hasRole('ADMIN') and hasRole('USER')") @RequestMapping(value = "/menuList",method = RequestMethod.GET) public Map<String,Object> menuList(){ Map<String,Object> result = new HashMap<>(); List sysMenuEntityList = sysMenuService.list(); result.put("title","擁有用戶和管理員角色都可以查看"); result.put("data",sysMenuEntityList); return ResultUtil.resultSuccess(result); }

通常情況下使用hasRole和hasAnyRole基本可以滿足大部分鑒權(quán)需求,但是有時(shí)候面對更復(fù)雜的場景上述常規(guī)表示式無法完成權(quán)限認(rèn)證,Security也為我們提供了解決方案.通過hasPermission()來擴(kuò)展表達(dá)式.使用hasPermission()首先要實(shí)現(xiàn)PermissionEvaluator接口

/** * 自定義權(quán)限注解驗(yàn)證 * @Author Sans * @CreateTime 2019/10/6 13:31 */@Componentpublic class UserPermissionEvaluator implements PermissionEvaluator { @Autowired private SysUserService sysUserService; /** * hasPermission鑒權(quán)方法 * 這里僅僅判斷PreAuthorize注解中的權(quán)限表達(dá)式 * 實(shí)際中可以根據(jù)業(yè)務(wù)需求設(shè)計(jì)數(shù)據(jù)庫通過targetUrl和permission做更復(fù)雜鑒權(quán) * 當(dāng)然targetUrl不一定是URL可以是數(shù)據(jù)Id還可以是管理員標(biāo)識等,這里根據(jù)需求自行設(shè)計(jì) * @Author Sans * @CreateTime 2019/10/6 18:25 * @Param authentication 用戶身份(在使用hasPermission表達(dá)式時(shí)Authentication參數(shù)默認(rèn)會自動帶上) * @Param targetUrl 請求路徑 * @Param permission 請求路徑權(quán)限 * @Return boolean 是否通過 */ @Override public boolean hasPermission(Authentication authentication, Object targetUrl, Object permission) { // 獲取用戶信息 SelfUserEntity selfUserEntity =(SelfUserEntity) authentication.getPrincipal(); // 查詢用戶權(quán)限(這里可以將權(quán)限放入緩存中提升效率) Set permissions = new HashSet<>(); List sysMenuEntityList = sysUserService.selectSysMenuByUserId(selfUserEntity.getUserId()); for (SysMenuEntity sysMenuEntity:sysMenuEntityList) { permissions.add(sysMenuEntity.getPermission()); } // 權(quán)限對比 if (permissions.contains(permission.toString())){ return true; } return false; } @Override public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) { return false; }}

在請求方法上添加hasPermission示例

/** * 擁有sys:user:info權(quán)限可以訪問 * hasPermission 第一個(gè)參數(shù)是請求路徑 第二個(gè)參數(shù)是權(quán)限表達(dá)式 * @Author Sans * @CreateTime 2019/10/2 14:22 * @Return Map 返回?cái)?shù)據(jù)MAP */ @PreAuthorize("hasPermission('/admin/userList','sys:user:info')") @RequestMapping(value = "/userList",method = RequestMethod.GET) public Map<String,Object> userList(){ Map<String,Object> result = new HashMap<>(); List sysUserEntityList = sysUserService.list(); result.put("title","擁有sys:user:info權(quán)限都可以查看"); result.put("data",sysUserEntityList); return ResultUtil.resultSuccess(result); }

hasPermission可以也可以和其他表達(dá)式聯(lián)合使用

/** * 擁有ADMIN角色和sys:role:info權(quán)限可以訪問 * @Author Sans * @CreateTime 2019/10/2 14:22 * @Return Map 返回?cái)?shù)據(jù)MAP */ @PreAuthorize("hasRole('ADMIN') and hasPermission('/admin/adminRoleList','sys:role:info')") @RequestMapping(value = "/adminRoleList",method = RequestMethod.GET) public Map<String,Object> adminRoleList(){ Map<String,Object> result = new HashMap<>(); List sysRoleEntityList = sysRoleService.list(); result.put("title","擁有ADMIN角色和sys:role:info權(quán)限可以訪問"); result.put("data",sysRoleEntityList); return ResultUtil.resultSuccess(result); }

七.測試

創(chuàng)建賬戶這里用戶加密使用了Security推薦的bCryptPasswordEncoder方法

? /** * 注冊用戶 */ @Test public void contextLoads() { // 注冊用戶 SysUserEntity sysUserEntity = new SysUserEntity(); sysUserEntity.setUsername("sans"); sysUserEntity.setPassword(bCryptPasswordEncoder.encode("123456")); // 設(shè)置用戶狀態(tài) sysUserEntity.setStatus("NORMAL"); sysUserService.save(sysUserEntity); // 分配角色 1:ADMIN 2:USER SysUserRoleEntity sysUserRoleEntity = new SysUserRoleEntity(); sysUserRoleEntity.setRoleId(2L); sysUserRoleEntity.setUserId(sysUserEntity.getUserId()); sysUserRoleService.save(sysUserRoleEntity); }

登錄USER角色賬號,登錄成功后我們會獲取到身份認(rèn)證的Token

訪問USER角色的接口,把上一步獲取到的Token設(shè)置在Headers中,Key為Authorization,我們之前實(shí)現(xiàn)的JWTAuthenticationTokenFilter攔截器會根據(jù)請求頭中的Authorization獲取并解析Token

使用USER角色Token訪問ADMIN角色的接口,會被拒絕,告知未授權(quán)(暫無權(quán)限會進(jìn)入我們定義的UserAuthAccessDeniedHandler這個(gè)類進(jìn)行處理)

更換ADMIN角色進(jìn)行登錄并訪問ADMIN接口

今天就講到這里吧,如果覺得不錯(cuò),記得點(diǎn)贊轉(zhuǎn)發(fā)支持一波,謝謝~~~

作者:Sans_

來源:juejin.im/post/5da82f066fb9a04e2a73daec

總結(jié)

以上是生活随笔為你收集整理的@builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

精品国产1区2区3区 国产欧美精品在线观看 | 在线中文日韩 | 午夜国产成人 | 国产精品美女久久久久久 | 国产午夜一级毛片 | 中文字幕在线观看第一区 | 欧美综合色在线图区 | 精品欧美小视频在线观看 | 干av在线| 成人午夜精品 | 久久五月婷婷丁香社区 | 中文字幕日韩无 | 亚洲午夜久久久久久久久 | 欧美精品一区在线发布 | 国产精品精品 | 在线观看日韩精品视频 | 91av亚洲 | 国产九九精品 | 国产99精品| 中文字幕在线观看视频网站 | 国产精品中文字幕在线播放 | 色视频网页| 色婷婷av一区 | 人人操日日干 | 国产中文字幕视频在线观看 | 国产黄免费在线观看 | 成人一级影视 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 香蕉视频亚洲 | 成人中文字幕在线观看 | 精品亚洲男同gayvideo网站 | 91精选在线观看 | 亚洲专区一二三 | 最近中文字幕免费观看 | 在线看免费 | 亚洲欧美精品一区 | 99在线观看精品 | 国产精品一区二区三区在线 | 午夜精品一区二区三区四区 | 一二三久久久 | 天天干天天综合 | 激情综合色播五月 | 午夜影院先 | 玖操 | 国产一二三区av | 日韩高清不卡在线 | 一色屋精品视频在线观看 | 欧美另类视频 | 一区二区 不卡 | 久久九九影院 | 色多视频在线观看 | av在线免费在线观看 | a久久久久久 | 久久久国产影视 | 综合伊人久久 | 二区三区av | 日韩色在线 | 婷婷丁香社区 | 99免费国产 | 五月导航 | 在线播放亚洲 | 日韩欧美视频在线播放 | www178ccom视频在线 | 精品国产伦一区二区三区观看说明 | 国产在线播放观看 | 91亚洲在线 | 91尤物在线播放 | 国产精品一区二区三区免费看 | 国产五月婷 | 日韩精品视频在线观看网址 | 国产精品久久久久久吹潮天美传媒 | 天天爱天天 | 麻豆视频在线免费 | av在线8 | 欧美性性网 | 日韩免费精品 | 在线观看免费中文字幕 | 在线视频免费观看 | 999成人免费视频 | 久久久精选| 激情欧美在线观看 | 中文字幕丰满人伦在线 | 99人久久精品视频最新地址 | 亚州欧美精品 | 亚洲 成人 一区 | 国产黄色高清 | 91免费视频黄 | 人人爽人人舔 | 国产一区二区播放 | 国产亚洲精品久久久久久久久久久久 | 国产一区二区高清视频 | 中文字幕刺激在线 | 精品亚洲成人 | 黄色网www| 91系列在线观看 | 天天爱天天色 | 国产成人在线免费观看 | 一区二区丝袜 | 一区二区视频免费在线观看 | 成人在线一区二区三区 | 91久久精品日日躁夜夜躁国产 | 91麻豆精品一区二区三区 | 久久久精品国产一区二区电影四季 | 亚洲成人软件 | 91在线播| 干 操 插 | 日韩精品一区二区在线观看 | 国产亚洲91 | 伊人中文网 | 国产成人三级 | 国内精品久久久久久中文字幕 | 久久综合婷婷国产二区高清 | 久久人人97超碰com | 在线观看中文字幕网站 | 久久久久网址 | 国产91精品看黄网站在线观看动漫 | 天天婷婷 | 四虎最新域名 | 婷婷性综合 | 夜夜夜精品| 国产高清专区 | 免费av看片| 97国产视频 | 美女视频免费一区二区 | 激情av综合 | 色综合久久久久综合体 | 91丨九色丨国产在线 | 成人国产精品久久久春色 | 中文字幕在线免费看线人 | 免费男女羞羞的视频网站中文字幕 | 亚洲国产精品va在线看黑人 | 国产成人三级三级三级97 | 久久久影院一区二区三区 | 免费看黄视频 | 欧美孕妇与黑人孕交 | 国产精品免费小视频 | 亚洲理论在线观看电影 | 久久综合色一综合色88 | 国产一区二区三区 在线 | 五月婷婷影院 | 黄色h在线观看 | 色播五月激情五月 | 97人人网 | 干干夜夜 | 午夜精品一区二区国产 | 欧美日韩视频在线观看一区二区 | 日操操| 久久黄色免费视频 | 久久99久国产精品黄毛片入口 | 亚洲精品资源在线观看 | 午夜av在线播放 | 亚洲国产精品500在线观看 | 欧美片网站yy | 中文在线a∨在线 | 亚洲天堂网在线视频 | 久久国语露脸国产精品电影 | 91av成人| 国产精品高潮呻吟久久av无 | 欧美精品一级视频 | 黄色成人av | 久草在线视频免赞 | 精品美女在线视频 | 岛国大片免费视频 | 欧美在线视频a | 色婷婷中文 | 日韩女同一区二区三区在线观看 | 国产黄色一级大片 | 激情五月婷婷激情 | 久久y| 中国精品一区二区 | 中文字幕亚洲不卡 | 狠狠干干 | 91高清免费 | av免费网站在线观看 | 精品国产伦一区二区三区观看体验 | 天天天色综合a | 久久在线视频在线 | 激情亚洲综合在线 | 国产精品久久久久久久久软件 | 免费在线成人 | 91精品专区 | 精品一区二区三区在线播放 | 日韩国产欧美在线播放 | 免费色黄 | 99在线视频观看 | 在线视频电影 | 久久久久久综合网天天 | 激情欧美一区二区免费视频 | 国产999视频 | 激情综合网在线观看 | 日韩大片免费在线观看 | 波多野结衣理论片 | 日韩精品不卡在线观看 | 亚洲性xxxx| 最近中文字幕高清字幕免费mv | 99久久99视频只有精品 | 成人97人人超碰人人99 | 欧美日韩一二三四区 | 国产精品手机在线观看 | 国产精品不卡视频 | 国产成人三级在线观看 | 日韩免费电影网 | 青青看片 | 开心激情综合网 | 欧美aaa一级| 国产99久久精品 | 成年人免费电影在线观看 | 亚洲精品男人天堂 | 狠狠躁夜夜躁人人爽视频 | 夜夜夜影院 | 成人理论在线观看 | 欧美色图视频一区 | 欧美va日韩va | 久久午夜影院 | 国产一区二区三区久久久 | 久久兔费看a级 | 超碰成人av | 亚洲一区二区三区毛片 | 欧美少妇的秘密 | 国产精品video爽爽爽爽 | 亚洲一级黄色大片 | 高清有码中文字幕 | 久久午夜网 | 日韩久久午夜一级啪啪 | 九九免费观看视频 | av三级在线看 | 国产成人一区二区三区在线观看 | 97av.com| 日韩中文字幕免费在线播放 | 99草在线视频 | 国产视频在线观看一区 | 亚洲日本成人网 | 午夜久久影视 | 香蕉影院在线播放 | 成人精品一区二区三区电影免费 | 天天干夜夜操视频 | 欧美一级在线看 | 国产在线超碰 | 在线视频亚洲 | 欧美另类色图 | 超碰99人人| 成人a在线| 国产免费精彩视频 | 日韩精品一区二区三区不卡 | 国产一区免费看 | 免费观看一级成人毛片 | 干干操操| 国产天天综合 | 91精品国产九九九久久久亚洲 | 成+人+色综合 | 国精产品999国精产品岳 | 日韩一三区 | 国产97视频在线 | 久久九九影视 | 国产色妞影院wwwxxx | 色综合天天综合网国产成人网 | 中文字幕在线观看免费高清完整版 | 亚洲高清av在线 | 有码视频在线观看 | 999久久久精品视频 日韩高清www | 国产精品毛片一区视频播 | 国内精品久久久久久久影视麻豆 | 五月婷婷在线视频 | 97狠狠干 | 日日色综合 | 欧美日韩在线免费观看视频 | 最近中文字幕完整视频高清1 | 99久久免费看 | 五月婷婷在线视频 | 精品欧美小视频在线观看 | 亚洲精品影视 | 国产v在线| 人人超碰免费 | 欧美黑吊大战白妞欧美 | 亚洲精品中文在线观看 | 国产精品一区二区电影 | 天天天色综合a | 国产99久久久久 | 中文字幕在线影院 | 欧美aaa一级| 91精品啪在线观看国产81旧版 | 2019中文在线观看 | 99久久精品免费看国产麻豆 | 日日夜夜精品免费观看 | 国产成人精品一区二区三区免费 | 欧美日韩91 | 亚洲免费成人 | 国产精品久久久久久欧美 | 久精品视频在线观看 | 成人亚洲精品国产www | 一区电影 | 九九国产视频 | 亚洲九九九在线观看 | 日韩在线视频一区二区三区 | 成人av播放 | 中文字幕第一页在线 | 欧美一级小视频 | 精品亚洲免a | 99热这里只有精品在线观看 | 日本精品视频网站 | a级国产乱理伦片在线观看 亚洲3级 | 波多野结衣电影久久 | 香蕉在线播放 | 蜜臀久久99精品久久久无需会员 | 91看片淫黄大片在线播放 | 中日韩三级视频 | 久久精品之 | 久草干| 韩日三级在线 | 日本韩国精品在线 | 99久久视频| 精品伦理一区二区三区 | 不卡的av中文字幕 | av大全在线免费观看 | www91在线观看 | 中文免费观看 | 精品国产一区二区三区男人吃奶 | 91精品国产一区二区三区 | 成人午夜网址 | 99热最新在线 | 亚洲精品在线播放视频 | 亚洲一区二区视频 | 中文字幕一区二区在线播放 | 成人免费xxxxxx视频 | 婷婷色网站 | 日韩精品91偷拍在线观看 | 国产一级大片在线观看 | 亚洲视频999 | 91精品一区国产高清在线gif | 亚洲精品日韩在线观看 | 亚洲国产97在线精品一区 | 成人啪啪18免费游戏链接 | 国产精品一区二区久久精品爱涩 | 久久久美女| 国产尤物一区二区三区 | 国产91精品高清一区二区三区 | 国内毛片毛片 | 狠狠的干 | 人人精久 | 国产字幕av | 亚洲最大免费成人网 | 欧美91精品 | 中文字幕在线观看资源 | 免费福利片2019潦草影视午夜 | 国产视频综合在线 | 午夜久久精品 | 激情丁香在线 | 免费福利影院 | 日韩中文字幕视频在线 | 日韩欧美国产成人 | 国产一级视频 | 久久婷亚洲五月一区天天躁 | 丁香激情综合久久伊人久久 | 国产精品不卡在线观看 | 欧美激情综合五月色丁香小说 | 欧美一级电影片 | 粉嫩av一区二区三区入口 | 欧美日韩二三区 | av品善网 | 涩涩爱夜夜爱 | 97超碰超碰 | 久久手机视频 | 中文字幕资源站 | 亚洲国产精品va在线 | 99热国内精品 | 手机av电影在线 | 伊人五月婷 | 欧美一级性生活视频 | 特级西西www44高清大胆图片 | 天天夜夜亚洲 | 日韩欧美一区二区在线播放 | 亚洲精品国产综合99久久夜夜嗨 | 欧美日韩视频在线播放 | 91在线文字幕 | 国产精品欧美在线 | 不卡精品 | 国产精品女同一区二区三区久久夜 | 亚洲黄色av网址 | 一区二区三区高清 | 免费看的黄网站 | 91成人精品国产刺激国语对白 | 免费观看www小视频的软件 | 日本精品久久久一区二区三区 | 国产精品视频地址 | h网站免费在线观看 | 久久免费成人网 | 免费看色的网站 | 欧美日韩中文字幕在线视频 | 韩日精品在线观看 | 黄色激情网址 | 久久国产精品免费视频 | 国产一区二区手机在线观看 | 91日韩国产 | a级一a一级在线观看 | 黄色软件视频大全免费下载 | 91在线观看欧美日韩 | 免费在线观看日韩欧美 | 婷婷丁香色| 天天插天天狠天天透 | 国产精品ssss在线亚洲 | 久久久高清视频 | www.夜色321.com| 99视频免费 | 精品毛片在线 | 午夜美女av | 国产精品久久久久久久久久久免费 | 欧亚久久 | 日本在线视频网址 | 亚洲精品乱码久久久久久蜜桃91 | 国产精品久久久久三级 | www激情com| 精品国模一区二区 | 在线免费观看黄色av | 特级毛片网 | 麻豆系列在线观看 | 精品国产一区二区三区久久久久久 | 一区二区三区四区在线免费观看 | 在线免费观看国产黄色 | 黄av在线| 国产日韩欧美在线免费观看 | 97精品久久 | 夜夜操天天干, | 日b黄色片 | 成人av免费看 | 色婷婷 亚洲 | 在线一二区 | 国产va精品免费观看 | 中文字幕一区二区三区乱码在线 | 最近的中文字幕大全免费版 | 在线观看黄a | 豆豆色资源网xfplay | 最近的中文字幕大全免费版 | 国产手机在线观看 | 国产福利一区二区三区在线观看 | 日韩在线视频一区二区三区 | 在线观看中文字幕一区二区 | 国产精品午夜免费福利视频 | a天堂免费 | 小草av在线播放 | 亚州性色| 99精品视频免费看 | 成年人黄色免费看 | 日韩欧美亚州 | 91精品啪在线观看国产 | avav片| 国产韩国日本高清视频 | av资源在线看 | 亚州精品天堂中文字幕 | 亚洲经典中文字幕 | 91chinese在线| 免费av黄色| 久久久久久久久久久久av | 在线视频观看你懂的 | 手机在线日韩视频 | 日韩精品网址 | 91亚洲影院| 在线久热 | 一本到在线 | 国产小视频91 | 亚洲国产高清在线观看视频 | 国产 成人 久久 | 欧美久久久影院 | 日精品在线观看 | 99热在线看 | 亚洲精品视频第一页 | 中文字幕日韩高清 | 97国产在线观看 | 欧美一区在线观看视频 | 日韩在线电影观看 | 日日夜夜精品免费 | 免费美女av | 色人久久 | 日韩中文字幕免费在线观看 | 人人看97 | 精品国产免费久久 | 亚洲一区久久 | 97自拍超碰 | 麻豆视频在线免费观看 | 国产高清在线精品 | 国产高清在线一区 | 黄色av电影一级片 | 久久久久久久久久久久久久av | 97成人资源站 | 91九色蝌蚪国产 | 欧洲激情在线 | 国产99久久九九精品免费 | 中文字幕在线视频第一页 | 欧美一区二区三区免费观看 | 2021国产在线| 久久手机看片 | 久久久久久久久影视 | 青青草国产精品视频 | 成人a视频 | 中文字幕在线观看一区 | 狠狠操综合网 | 波多野结衣电影久久 | 久草免费在线视频 | 免费成人在线观看视频 | av在线8 | 999久久精品 | 亚洲经典中文字幕 | 少妇精69xxtheporn | av高清一区 | 天天操月月操 | 亚洲国产精品人久久电影 | 亚洲砖区区免费 | 日韩色视频在线观看 | 欧美一级片在线免费观看 | 丁香六月伊人 | 亚洲精品国偷自产在线99热 | 韩国一区二区三区在线观看 | 欧美一区二区精美视频 | 欧美a级在线免费观看 | 黄色精品网站 | 国产精品久久久一区二区三区网站 | 一区三区视频在线观看 | 欧美日韩一区二区三区在线免费观看 | 国产999视频 | 综合久久婷婷 | 亚洲一区精品人人爽人人躁 | 国产不卡免费av | 五月婷久久| 免费国产一区二区视频 | 激情网五月天 | 日韩欧美高清一区二区三区 | 日韩欧美一二三 | 91av小视频 | 99日精品 | 久草免费福利在线观看 | 成人高清在线 | 1024手机基地在线观看 | av电影一区二区三区 | 2023亚洲精品国偷拍自产在线 | 久久免费视频4 | 成人精品国产 | 日本一区二区三区视频在线播放 | 婷婷九月丁香 | 国产精品久久久久国产精品日日 | 国产高清在线免费观看 | 日日婷婷夜日日天干 | 成人免费看视频 | 天天色综合1 | 久久艹国产视频 | 国产精品区一区 | 欧美久久久久 | 日本在线成人 | 狠狠网站 | 97在线精品| 免费av黄色| 国产一区二区在线看 | 久久免费精品国产 | 国产精品久久久久亚洲影视 | 973理论片235影院9 | 丁香花在线观看免费完整版视频 | 精精国产xxxx视频在线播放 | 99久久久久久国产精品 | 国产成人精品aaa | 中文在线字幕观看电影 | av黄色在线播放 | 五月av在线| 久久网址 | 亚洲天堂自拍视频 | 午夜av电影院 | 亚洲精品视频免费看 | 99产精品成人啪免费网站 | www国产亚洲| 国产在线一区二区三区播放 | 国产乱视频| 91精品在线免费视频 | 日本在线中文在线 | 日韩在线电影观看 | 国产精品久久久久久久久久妇女 | 久久久电影 | 成人丁香花 | 久久国产精品免费一区二区三区 | 六月久久婷婷 | 欧美激情视频免费看 | 在线看片中文字幕 | 亚洲视频www | 久久97视频 | 最近中文字幕免费大全 | 国产精品日韩在线 | 人人草人人草 | 伊人久久一区 | 国产精品免费不卡 | 在线播放 日韩专区 | 天堂视频一区 | 奇米影视8888在线观看大全免费 | 久久久久久久久久久国产精品 | 黄色av一级片 | 国产精品久久久久久久久久了 | 久久狠狠一本精品综合网 | 五月婷婷在线视频观看 | av在线播放国产 | 日韩中文字幕在线观看 | 婷婷亚洲最大 | 欧美日韩精品综合 | 国产高清中文字幕 | av成年人电影 | 亚洲午夜精品一区 | 国产精品美女www爽爽爽视频 | 91在线国内视频 | 久久五月婷婷丁香社区 | 欧美 亚洲 另类 激情 另类 | 91自拍视频在线观看 | 日本不卡123区 | 99视频精品免费观看, | 成人免费网站视频 | 九九视频在线播放 | 五月天激情视频 | 在线播放日韩 | 色九色| 人人玩人人添人人 | 在线免费观看视频a | 日韩电影久久 | 在线播放 一区 | 免费看久久 | 樱空桃av| 狠狠色噜噜狠狠狠狠2021天天 | 亚洲精品高清视频 | 五月婷婷开心 | 亚洲视频电影在线 | 国产精品1区2区3区在线观看 | 天天躁天天狠天天透 | 亚洲精品白浆高清久久久久久 | 中字幕视频在线永久在线观看免费 | 日韩电影在线视频 | 尤物97国产精品久久精品国产 | 欧美综合国产 | 日韩精品久久久免费观看夜色 | 国产精品精品国产婷婷这里av | 在线天堂中文www视软件 | 国产很黄很色的视频 | 日韩mv欧美mv国产精品 | 成人h视频在线播放 | 中文字幕 国产 一区 | 久久久久久99精品 | www.国产在线视频 | 天天插日日射 | 亚洲精品视频网站在线观看 | 久久96国产精品久久99漫画 | 三上悠亚一区二区在线观看 | 久久一区91| 国产aa精品| 波多野结衣最新 | 成人免费在线观看av | 久久私人影院 | 欧日韩在线 | 狠狠干狠狠艹 | 色在线免费观看 | 欧美日本中文字幕 | 亚洲一级免费观看 | 免费视频久久久 | 欧美日韩亚洲国产一区 | 夜夜躁日日躁 | 992tv在线 | 国产999在线观看 | 久久精品99精品国产香蕉 | 成人91在线观看 | 欧美在线观看视频免费 | 黄色av电影网 | 中文字幕在线观看一区二区 | 综合色伊人 | 亚洲午夜在线视频 | 91日韩精品| 久久天天躁夜夜躁狠狠85麻豆 | 日韩精品一区二区三区三炮视频 | 又粗又长又大又爽又黄少妇毛片 | 欧美另类成人 | www黄免费| 美女网站在线免费观看 | 又爽又黄又刺激的视频 | 精品欧美小视频在线观看 | 在线视频婷婷 | 91精品国产三级a在线观看 | 日本中文字幕系列 | 99热.com| 欧美日韩一区二区三区不卡 | www.夜夜操.com | 成人a视频在线观看 | 欧美精选一区二区三区 | 麻豆视频网址 | 中文字幕在线观看第一页 | 国产不卡在线观看视频 | 视频一区二区在线 | 欧美中文字幕久久 | 成人久久久久久久久久 | 日韩手机在线 | av不卡免费在线观看 | 欧美粗又大 | 国产一卡二卡四卡国 | 五月天中文字幕 | 午夜精品久久一牛影视 | 91丨九色丨高潮丰满 | 国产精品 日韩 欧美 | 日韩系列在线观看 | 亚洲精品成人av在线 | 天天干天天操天天射 | 香蕉视频在线播放 | 亚洲精品456在线播放 | 国产精品久久久久9999吃药 | 欧美极品在线播放 | 久久久久国产a免费观看rela | 色婷婷亚洲婷婷 | 亚洲欧美色婷婷 | 日韩在线视频免费观看 | 天天色天天射天天综合网 | 97福利在线观看 | 国产特级毛片aaaaaaa高清 | 91在线观看欧美日韩 | 国产精品成人久久久久久久 | 香蕉视频在线观看免费 | 日韩精品一区二区三区免费观看 | 国产网红在线观看 | 999一区二区三区 | 9999精品免费视频 | 国产一区二区三区免费视频 | 五月色丁香| 天天干天天操天天射 | 亚洲天堂网站 | 中文在线a天堂 | 久久国产精品网站 | 91亚洲精品在线 | 国产亚洲精品久久久久久移动网络 | 天天射综合网视频 | 日韩欧美在线播放 | 久热av在线 | 五月天伊人网 | 国产精品一区久久久久 | 日韩亚洲国产中文字幕 | 永久av免费在线观看 | 国产精品免费视频网站 | 国产色在线视频 | 在线观看视频免费大全 | 在线观看国产www | 欧美一区二区精美视频 | 91精品天码美女少妇 | 粉嫩av一区二区三区入口 | 狠狠干狠狠操 | 成人a视频片观看免费 | 天天色天天操天天爽 | adc在线观看| 国产99爱| 2020天天干夜夜爽 | 欧美一级电影在线观看 | 8090yy亚洲精品久久 | 日韩二区三区在线 | 奇米网在线观看 | 久久久久久国产一区二区三区 | 在线观看视频在线 | 久热电影 | 精品国产视频一区 | 精品视频资源站 | 国产精品网红直播 | 在线观看免费国产小视频 | 狠狠成人| 一级免费片| 中文字幕资源在线 | 九九久久影院 | 日韩理论影院 | 精品a在线 | 最新日韩视频 | 网站在线观看日韩 | 在线视频 你懂得 | 久久全国免费视频 | 国产一级二级三级在线观看 | 韩国av永久免费 | 国产精品成人在线 | 综合久久网| 久久久人人爽 | 丁香婷婷色综合亚洲电影 | 久久免费在线视频 | 欧美日高清视频 | 99久久99久久| 亚洲成色| 久久久久久国产精品免费 | 丁香婷婷色月天 | 精品久久网 | 色综合天天综合网国产成人网 | 久久乐九色婷婷综合色狠狠182 | 成人小电影在线看 | 天天爱天天射 | 久久久久久久久久久久久久免费看 | 日韩在线免费 | 91九色网址 | 久久五月婷婷丁香社区 | 欧洲av不卡 | 97超碰精品 | 欧美国产三区 | 久久久久五月 | 免费中文字幕在线观看 | 国产一区在线视频播放 | 日韩av在线不卡 | 欧美激情第八页 | 大型av综合网站 | 91亚洲狠狠婷婷综合久久久 | 九色91av | 国产日韩欧美精品在线观看 | 国产精品成人一区二区三区吃奶 | 国产精品日韩在线播放 | 麻豆视频免费播放 | 久久久高清 | 欧美一级激情 | 久久av网址 | 国产午夜精品免费一区二区三区视频 | 亚洲国产三级在线观看 | 国产精品女同一区二区三区久久夜 | 特级毛片网站 | 999视频网站 | 国产精品欧美一区二区三区不卡 | 国产最新91| 91网免费看| 免费观看91视频大全 | 久久久精品99 | 国内三级在线观看 | www.人人草 | 久久综合精品一区 | 日日夜夜精品免费视频 | 色综合天天射 | 在线观看视频免费大全 | 天天爽夜夜爽人人爽一区二区 | 69av视频在线观看 | 亚洲va在线va天堂 | 91av电影| 久久精品一区二区三 | 亚洲六月丁香色婷婷综合久久 | 人人添人人 | 日韩欧美国产成人 | 国产精品久久久毛片 | 99久久超碰中文字幕伊人 | 久久99久久久久 | 一级久久久| 丁香花在线观看视频在线 | 久久综合色综合88 | 91av播放| 日韩a级免费视频 | av不卡免费在线观看 | 久草国产在线观看 | 久久久久久久久电影 | 亚洲永久精品在线 | 久久国内精品 | 日日天天干 | 午夜美女福利直播 | 色全色在线资源网 | 91亚洲在线观看 | 久草在线资源观看 | 久久久国产精品视频 | 国产无套精品久久久久久 | 日韩丝袜 | 欧美日韩在线免费观看视频 | 日本精品久久久久中文字幕 | 69av国产| 日韩一区二区免费播放 | 99婷婷| 欧美污网站 | 中文字幕在线观看免费高清完整版 | 天天激情综合 | 草久在线观看 | 91精品天码美女少妇 | 成人一区二区在线观看 | 91最新中文字幕 | 国产97在线视频 | 日韩av免费在线看 | 欧美日韩成人 | 国产在线色站 | 在线免费高清一区二区三区 | 手机av在线不卡 | ww视频在线观看 | 免费av片在线 | 国产精品99久久免费黑人 | 日本一区二区三区免费看 | 色www免费视频 | 999ZYZ玖玖资源站永久 | 成人在线播放视频 | 99视频免费 | 日韩视频在线一区 | 免费久久片 | 日本aaaa级毛片在线看 | 91在线网址 | 久久精品看片 | 久久大香线蕉app | 免费在线h| 国产精品久久久久久久久婷婷 | 国产精品理论视频 | 99精品视频网站 | 91精品国产91热久久久做人人 | 波多野结衣久久精品 | 狠狠干夜夜操天天爽 | 久久成人综合 | 超碰97公开 | 在线观看日韩精品视频 | 国产精品99视频 | 国产操在线 | 国产日韩精品一区二区在线观看播放 | 在线观看视频亚洲 | 亚洲精品国产精品99久久 | 成人欧美一区二区三区黑人麻豆 | 天天干中文字幕 | 精品国产一区在线观看 | 四虎在线观看精品视频 | 久久一视频 | 97在线视频免费观看 | 久草精品国产 | 久久精品一区 | 在线观看亚洲国产精品 | 91日本在线播放 | 免费人成在线观看网站 | 亚洲精品久久久久中文字幕二区 | 婷婷av电影 | 国产精品久久久久亚洲影视 | 国产免费xvideos视频入口 | 久色伊人| 91av在| 精品一区精品二区高清 | 成人av片免费观看app下载 | 99热99| 欧美性性网 | 精品国产自在精品国产精野外直播 | 黄色av影视| 99精品黄色 | 在线视频中文字幕一区 | 三级av在线播放 | 国产群p| 夜色成人网 | 亚洲高清视频在线观看 | 中文字幕精品www乱入免费视频 | 国产精品一区二区在线 | 中文字幕在线观看视频一区 | 天天综合网天天 | 欧美日韩国产一区二区三区 | 久久精品视频观看 | 丁香电影小说免费视频观看 | 国产成人精品女人久久久 | 日韩欧美电影 | 亚洲国产美女精品久久久久∴ | 日韩电影在线观看中文字幕 | 国产一级在线视频 | 在线日本看片免费人成视久网 | 91免费网站在线观看 | 成人片在线播放 | 一区二区影视 | 91黄色在线视频 | 亚洲精欧美一区二区精品 | 日韩精品1区2区 | 在线成人免费av | 婷婷在线免费观看 | 日韩精品中文字幕av | 水蜜桃亚洲一二三四在线 | 国产美女精品在线 | 欧美在线视频一区二区 | 欧美日韩中文另类 | 911国产| 午夜少妇一区二区三区 | 欧美精品久久久久性色 | 久久国内视频 | 久久的色 | 国产不卡在线看 | 欧美美女激情18p | 国产精品专区h在线观看 | 欧美作爱视频 | 国产又粗又猛又色 | 99国产精品久久久久老师 | 制服丝袜一区二区 | 国产精品久久久久久久久久了 | 亚洲综合五月天 | 国产精品 9999 | 日本三级不卡 | 精品一二三四视频 | 伊甸园av在线 | 国产一区二区在线免费视频 | 奇米先锋 | 波多野结衣电影久久 | 少妇啪啪av入口 | 国产精品久久久久久久久久妇女 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国内偷拍精品视频 | 欧美日性视频 | 手机色在线 | 久久久 精品| 看毛片网站 | 中文字幕免费一区 | 在线观看中文字幕网站 | 色夜视频| 日韩黄色免费看 | 国模视频一区二区三区 | 99中文字幕在线观看 | 国产精品99久久久久久武松影视 | 91.麻豆视频| 久久久免费 | 能在线看的av | 免费男女羞羞的视频网站中文字幕 | 蜜臀久久99静品久久久久久 | 成人中文字幕+乱码+中文字幕 | 久久精品电影院 | 欧美在线视频一区二区三区 | 日韩视频免费 | 天天操天天干天天操天天干 | 亚洲精品在线资源 |