- 浏览: 57734 次
- 性别:
-
博客专栏
-
-
从零编写RPC框架
浏览量:0
文章分类
最新评论
-
39er:
请问如果采用同步方式,并行转换多个文档,会有问题吗
关于office转换pdf完美终极解决方案 -
Knightzxf:
Java操作word转PDF的功能除了你介绍的这几种外,还有其 ...
关于office转换pdf完美终极解决方案 -
javatozhang:
非常不错!!!
浅谈分布式项目日志监控
今天群里小伙伴有个需求,希望通过role来控制pojo字段校验。采用方式为spirng securtity+
spring validate 实现
spring4.0+ 默认支持jsr303。spring validate 也支持自定义valdiate注解。因此采用自定义validate注解实现
代码地址:https://github.com/ChenXun1989/role-validate
自定义validate注解
实现constraintValidator 接口
表单对象
权限控制
controler配置
页面测试
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>
发表评论
-
浅谈分布式项目日志监控
2016-11-04 13:52 6404目前公司项目采用dubbo服务化升级之后,原先大而全的几 ... -
java线程池demo
2016-09-02 15:12 1752接口 /** * Project Name:chenx ... -
solr中文分词
2016-08-21 14:37 836solr中文分词。 solr5.0 自带一个中文分词 ... -
solrcloud搭建
2016-08-20 18:27 1901群里小伙伴需要一个solrcloud的解决案例。正好好久 ... -
基于jquery把表单转成成json对象
2016-08-18 10:48 874最近前端框架修改,小伙伴希望能像以前写jsp一样使用 对象.属 ... -
springRest+cross跨域支持
2016-06-17 15:51 526最近一个接口项目需要支持跨域访问,基于cross实现。于是 ... -
java内存机制解析(二)
2016-05-04 22:25 0java内存溢出异常解析:OutOfMemoryErro ... -
java内存机制解析(一)
2016-05-04 22:01 461最近在看一些java底层知识,搬了这么久时间的砖头,也是时候了 ... -
关于office转换pdf完美终极解决方案
2016-03-12 11:54 7875最近项目上面有个需求,将用户上传的office格式转 ... -
关于ModelMap的小事
2016-03-08 18:54 1094今天对一个老系统框架的升级,需要修改原先响应的http报文 ... -
spring整合quartz任务调度框架使用
2016-02-26 14:57 464调度器 <bean autowire=" ... -
spring整合memcache
2016-02-26 14:50 466Xmemcached是基于java nio实现的高性能可扩 ... -
spring整合mongodb
2016-02-26 14:36 614MongoDB.是一个介于关� ... -
web项目整合solr服务实现全文检索
2016-02-26 14:24 5591Solr是一个高性能,采用Java5开发,Solr基于Lu ... -
java web权限管理
2015-12-18 14:29 1281之前项目采用spring4+security3做的权限管 ... -
spring4采用JSR349标准校验数据
2015-12-18 14:05 681Spring4.1内置支持了JSR349校验数据,相关配 ... -
spring4整合rest风格配置
2015-12-18 13:55 1197最近手头上有个新项目,打算采用前端js渲染+后端调用r ...
相关推荐
在权限管理系统中,这两个模块是核心,它们允许管理员分配和管理用户与角色的权限,实现细粒度的访问控制。用户权限列表允许管理员查看和修改单个用户的权限,而角色权限列表则集中管理角色所包含的一系列权限,便于...
在ABP中,权限管理通常与角色和用户关联,允许细粒度地控制谁可以访问哪些资源。权限验证通常在应用服务层进行,通过检查当前登录用户的权限来决定是否允许执行某个操作。 在上述`TaskAppService`示例中,虽然没有...
权限管理是ABP的核心特性之一,它允许细粒度的控制,比如基于角色、基于功能或基于业务实体的权限。 #### 基于角色的权限 ABP支持角色系统,每个角色可以拥有多个权限。用户可以分配给一个或多个角色,从而继承...
还可以结合角色和权限插件,如`spatie/laravel-permission`,实现更细粒度的访问控制。 ### 9. API集成与响应式设计 为了让博客功能更加强大,可以考虑集成第三方服务,如社交媒体分享按钮、评论系统或SEO优化工具...
- 权限与角色:使用 Laravel 的 Gate 或政策类实现细粒度的访问控制。 10. **错误处理与日志** - 错误处理:Laravel 自动处理 PHP 错误和异常,提供友好的错误页面。 - 日志:Laravel 使用 Monolog 库记录日志,...
- **细粒度权限管理**: 为不同类型的用户分配不同的权限。 - **角色模型**: 依据用户的角色来授予不同的访问权限。 - **访问控制列表(ACL)**: 明确指定哪些用户可以访问哪些资源。 #### 第七节 IO操作安全 本节...
而HttpHandler 更加具体,只处理特定类型的HTTP请求,提供更加细粒度的控制。 在实际应用中,HttpModule 可以用于实现以下功能: 1. 自定义身份验证:例如,实现基于OAuth或JWT的身份验证逻辑。 2. 日志记录:记录...