`
LoveLZY
  • 浏览: 57346 次
  • 性别: Icon_minigender_1
博客专栏
Group-logo
从零编写RPC框架
浏览量:0
社区版块
存档分类
最新评论

基于用户角色的细粒度validate

阅读更多
  今天群里小伙伴有个需求,希望通过role来控制pojo字段校验。采用方式为spirng securtity+
spring validate 实现
  spring4.0+ 默认支持jsr303。spring validate 也支持自定义valdiate注解。因此采用自定义validate注解实现
代码地址:https://github.com/ChenXun1989/role-validate
自定义validate注解
  /**
 * Project Name:chenxun-cros
 * File Name:RoleConstraint.java
 * Package Name:com.chenxun.validate
 * Date:2016年8月26日上午10:42:53
 * Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
 *
*/

package com.chenxun.example.validate;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.NotNull;

/**
 * ClassName:RoleConstraint <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2016年8月26日 上午10:42:53 <br/>
 * @author   陈勋
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=RoleConstraintValidator.class)
public @interface RoleConstraint {

	String message() default "ACCESS DENIED !";
	
	Class<?>[] groups() default { };
	
	Class<? extends Payload>[] payload() default { };
	/**
	 * 
	 * values:(角色列表). <br/>
	 * ROLE_ADMIN,ROLE_USER
	 * @author 陈勋
	 * @return
	 * @since JDK 1.7
	 */
	String[] value();
	
	
	
	

}





  实现constraintValidator 接口
  /**
 * Project Name:chenxun-cros
 * File Name:RoleConstraintValidator.java
 * Package Name:com.chenxun.validate
 * Date:2016年8月26日上午10:39:29
 * Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
 *
 */

package com.chenxun.example.validate;

import java.lang.annotation.Annotation;
import java.util.Collection;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;

/**
 * ClassName:RoleConstraintValidator <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON. <br/>
 * Date: 2016年8月26日 上午10:39:29 <br/>
 * 
 * @author 陈勋
 * @version
 * @since JDK 1.7
 * @see
 */
public class RoleConstraintValidator implements
		ConstraintValidator<Annotation, Object> {

	@Override
	public void initialize(Annotation constraintAnnotation) {

		// 初始化动作 可以提升性能。缓存用户的 所有字段。 优化下个方法调用

	}

	@Override
	public boolean isValid(Object value, ConstraintValidatorContext context) {
        //默认值处理
		if (value == null) {
			return true;
		}
		if (value instanceof Number) {

			Number num = (Number) value;
			if (num.byteValue() == 0) {
				return true;
			}
		}

		// 获取当前用户的角色列表
		ConstraintValidatorContextImpl cvci = (ConstraintValidatorContextImpl) context;

		RoleConstraint rc = (RoleConstraint) cvci.getConstraintDescriptor()
				.getAnnotation();
		String[] roles = rc.value();
		// 执行相关逻辑 角色和资源的关系(是否拥有资源权限)
		// 注意该校验与 value值无关
		Collection<? extends GrantedAuthority> auths = SecurityContextHolder
				.getContext().getAuthentication().getAuthorities();
		for (GrantedAuthority auth : auths) {
			// 简单原则,有其中一个角色即可
			for (String role : roles) {
				if (role.equals(auth.getAuthority())) {
					return true;
				}
			}
		}

		return false;
	}

}



  表单对象
/**
 * Project Name:validate-role
 * File Name:Product.java
 * Package Name:com.chenxun.example.entity
 * Date:2016年8月26日下午12:59:12
 * Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
 *
*/

package com.chenxun.example.entity;

import lombok.Data;

import com.chenxun.example.validate.RoleConstraint;

/**
 * ClassName:Product <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2016年8月26日 下午12:59:12 <br/>
 * @author   陈勋
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
@Data
public class Product {
	
	private String name;
	
	@RoleConstraint("ROLE_USER")
	private String password;
	
	@RoleConstraint("ROLE_ADMIN")
	private String desc;
	
	

}


  权限控制
 /**
 * Project Name:validate-role
 * File Name:SecurityConfig.java
 * Package Name:com.chenxun.example.config
 * Date:2016年8月26日下午1:04:18
 * Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
 *
*/

package com.chenxun.example.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * ClassName:SecurityConfig <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2016年8月26日 下午1:04:18 <br/>
 * @author   陈勋
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	
	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
		auth
			.inMemoryAuthentication()
				.withUser("admin").password("admin").roles("USER","ADMIN")
				.and().withUser("user").password("user").roles("USER");
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.formLogin().defaultSuccessUrl("/index.html");
		http.csrf().disable();
		http.authorizeRequests().antMatchers("/**").hasRole("USER");
		
	}

}

  /**
 * Project Name:validate-role
 * File Name:SecurityWebApplicationInitializer.java
 * Package Name:com.chenxun.example.config
 * Date:2016年8月26日下午1:37:41
 * Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
 *
*/

package com.chenxun.example.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

/**
 * ClassName:SecurityWebApplicationInitializer <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2016年8月26日 下午1:37:41 <br/>
 * @author   陈勋
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer{

}



  controler配置
package com.chenxun.example.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.util.FileCopyUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;

import com.chenxun.example.entity.Product;

/**
 * 
 * ClassName: ProdudctController <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason: TODO ADD REASON(可选). <br/>
 * date: 2016年8月26日 下午12:58:23 <br/>
 *
 * @author 陈勋
 * @version 
 * @since JDK 1.7
 */
@RestController
public class ProdudctController {
	
	@PostMapping("/product")
	public ResponseEntity<String> product(@Valid  @RequestBody Product product,BindingResult result){
		if(result.hasErrors()){
			return ResponseEntity.ok(result.getFieldError().getDefaultMessage());
		}
		return ResponseEntity.ok("SUCCESS");
	}
	
	
	
	

}


  页面测试
 <!DOCTYPE html>
<html >

<head>
<meta charset="utf-8">
<title>index</title>
<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body >
    <h1>Hello world</h1>
    
    <input type="button" value="testRoleUser" id="add1">
     <input type="button" value="testRoleAdmin" id="add2">
     
     
     <a href="/logout">重新登陆</a>

	<script type="text/javascript">
		$(function(){
			
			$("#add1").on("click",function(){
				
				var values={
	    				name:"abc",
	    				password:"pass"
	    		}
				
				 $.ajax({
		    			url:"product",
		    			type:"post",
		    			contentType:"application/json",
		    			data:JSON.stringify(values) ,		    			
		    			success:function(res){
		    				alert(res);
		    			}
		    		}); 
			});
			
			$("#add2").on("click",function(){
				
				var values={
	    				name:"abc",
	    				desc:"pass"
	    		}
				
				 $.ajax({
		    			url:"product",
		    			type:"post",
		    			contentType:"application/json",
		    			data:JSON.stringify(values) ,		    			
		    			success:function(res){
		    				alert(res);
		    			}
		    		}); 
			});
    		
		});
	
	</script>
</body>
</html>



分享到:
评论

相关推荐

    基于Bootstrap与jQuery-validate的个人封装检验框架实例

    基于Bootstrap与jQuery-validate的个人封装检验框架demo,拥有良好的UI与用户体验.博客地址:http://blog.csdn.net/u010506919/article/details/75137353

    基于Bootstrap与jQuery-validate的个人封装检验框架demo

    本项目"基于Bootstrap与jQuery-validate的个人封装检验框架demo"是一个很好的实践示例,展示了如何将这两个强大的库结合使用,以创建具有出色UI和用户体验的验证框架。 Bootstrap是由Twitter开发的一个开源前端框架...

    validate方法

    标题中的"validate方法"通常指的是在编程中用于验证数据或对象的方法。...在实际开发中,正确地应用validate方法可以预防各种潜在的问题,如用户输入错误、安全漏洞等,从而提升用户体验和系统的稳定性。

    jquery validate 信息气泡提示

    在网页开发中,jQuery Validate 是一个非常常用的验证插件,用于对用户输入的数据进行校验,确保数据的有效性和完整性。这个插件可以帮助开发者创建复杂的表单验证规则,提高用户体验,减少服务器端的压力。结合 ...

    jQueryValidate.rar

    首先,jQuery Validate插件是基于流行的JavaScript库jQuery构建的,因此在使用之前,需要确保页面已经引入了jQuery。接着,我们引入jQuery Validate的核心文件`jquery.validate.js`,它包含了验证插件的主要功能。...

    jquery validate 使用详解

    jQuery Validate 是一款强大的表单验证插件,基于 jQuery 框架开发而成。它能够帮助开发者轻松实现客户端表单验证功能,大大提高了用户体验并减少了服务器端的压力。通过简单地配置选项,即可启用各种内置验证规则。...

    jQuery Validate 1.1.2

    jQuery Validate 是一个强大的JavaScript库,专门...总之,jQuery Validate 1.1.2是前端开发者的得力工具,能够有效地处理表单验证,提供了一种优雅的方式来确保用户输入的数据质量,提升了网站的安全性和用户体验。

    mysql 安装密码校验插件validate_password.docx

    - 为了不影响现有用户,可以在安装插件前创建一个没有启用该插件的新用户组,然后将新用户分配到这个组。 通过以上步骤,你便成功安装了MySQL的validate_password插件,并可以根据需要调整密码策略,为数据库系统...

    jquery.validate 版本大全

    jquery.validate.1.9.0.min.js jquery.validate.1.12.0.min.js jquery.validate.1.13.1.min.js jquery.validate.1.16.0.min.js jquery.validate.1.14.0.min.js jquery.validate.1.15.1.min.js jquery.validate....

    比较好用的 FormValidate

    在实际应用中,开发者可以利用FormValidate轻松设置验证规则,避免用户提交无效或错误的数据。例如,可以使用它来验证用户注册时的邮箱格式、密码强度,或者在购物车结算时验证收货地址的完整性。同时,通过查阅CHM...

    jquery validate例子

    《jQuery Validate插件详解与实例应用》 ...通过学习和掌握jQuery Validate,我们可以为用户提供更加友好、安全的表单交互体验。在实际项目中,可以根据需求调整和扩展验证规则,以满足各种复杂场景。

    jquery validate 表单验证

    以上就是jQuery Validate的基本使用和核心概念,通过熟练掌握这些,你可以轻松实现高效且用户友好的表单验证。记住,始终要关注用户体验,避免过于繁琐的验证过程,同时确保数据安全性和准确性。

    jquery validate

    《jQuery Validate插件详解与应用》 在Web开发中,表单验证是不可或缺的一部分,而jQuery Validate插件作为一款强大的JavaScript验证工具,极大地简化了这一过程。本文将深入探讨jQuery Validate插件的基本概念、...

    jquery.validate.js下载

    jquery.validate.js jquery.validate.js

    jquery validate 验证手册

    《jQuery Validate验证手册》是针对JavaScript库jQuery的一个插件,主要功能是提供强大的表单验证功能,帮助开发者创建用户友好的、功能丰富的交互式表单。这个插件基于jQuery库,利用JavaScript的强大功能,简化了...

    jQuery.validate 用法

    《jQuery.validate 用法详解及源码解析》 在网页开发中,表单验证是必不可少的一环,确保用户输入的数据符合预设的规则,避免无效数据的...对于任何涉及用户输入验证的项目,jQuery.validate都是一个值得信赖的选择。

    JQuery UI和Validate的应用

    jQuery UI是一个基于jQuery的库,它扩展了基本的jQuery功能,提供了大量的用户界面组件和交互效果。这些组件包括但不限于: 1. **对话框(Dialogs)**:用于创建弹出式窗口,可以用于警告、确认或提供更多信息。 2....

    struts1.2 validate 源代码 实现

    Struts1.2框架是Apache组织开发的一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。在Struts1.2中,`validate`机制是用于处理表单验证的重要部分,它帮助开发者在用户提交数据之前检查输入的...

    基于用户协同过滤python

    本文将深入探讨如何在Python环境中实现基于用户协同过滤的推荐系统,并结合 Movielens 数据集进行实践。 首先,协同过滤是一种基于用户行为的推荐方法,它假设如果两个用户在过去对某些物品有相似的评价,那么他们...

    validate验证

    在IT行业中,`validate验证`是一个非常重要的环节,特别是在前端开发中,用于确保用户输入的数据是合法、有效和安全的。`jQuery Validate`是一个广泛使用的jQuery插件,它提供了强大的表单验证功能,使得开发者可以...

Global site tag (gtag.js) - Google Analytics