用过了Spring Security,一般都不会采用这种简单的自定义方式.自定义当然灵活自由,越要完善,也就意味做的工作越多.使用框架,别人考虑得相对周到,比如spring security的防止攻击就有session fixation, clickjacking, cross site request forgery.以下的简单实现的权限控制虽然可以去实现这样的功能,但就没必要了.当然这个模型是包含认证和授权.
1.写一个自定义注解(功能类似于spring security的@PreAuthorize)
- package org.exam.auth;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface Auth {
- String value() default "";
- String name() default "";
- }
2.写一个拦截器.
- package org.exam.auth;
- import org.springframework.http.HttpStatus;
- import org.springframework.web.method.HandlerMethod;
- import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.PrintWriter;
- import java.util.Set;
- public class AuthInterceptor extends HandlerInterceptorAdapter {
- public static final String SESSION_USERID = "kUSERID";
- public static final String SESSION_AUTHS = "kAUTHS";
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- boolean flag = true;
- if (handler instanceof HandlerMethod) {
- Auth auth = ((HandlerMethod) handler).getMethod().getAnnotation(Auth.class);
- if (auth != null) {// 有权限控制的就要检查
- if (request.getSession().getAttribute(SESSION_USERID) == null) {// 没登录就要求登录
- response.setStatus(HttpStatus.FORBIDDEN.value());
- response.setContentType("text/html; charset=UTF-8");
- PrintWriter out=response.getWriter();
- out.write("{\"type\":\"nosignin\",\"msg\":\"请您先登录!\"}");
- out.flush();
- out.close();
- flag = false;
- } else {// 登录了检查,方法上只是@Auth,表示只要求登录就能通过.@Auth("authority")这类型,验证用户权限
- if (!"".equals(auth.value())) {
- Set<String> auths = (Set<String>) request.getSession().getAttribute(SESSION_AUTHS);
- if (!auths.contains(auth.value())) {// 提示用户没权限
- response.setStatus(HttpStatus.FORBIDDEN.value());
- response.setContentType("text/html; charset=UTF-8");
- PrintWriter out=response.getWriter();
- out.write("{\"type\":\"noauth\",\"msg\":\"您没有"+auth.name()+"权限!\"}");
- out.flush();
- out.close();
- flag = false;
- }
- }
- }
- }
- }
- return flag;
- }
- }
处理controller的@RequestMapping方法(这里的处理直接通过response处理,spring security先抛异常,然后再统一处理异常):
a.如果这个方法没有使用Auth注解,会认为没有作权限控制,任何人可以访问.
b.如果这个方法只标注了@Auth,如果用户没登录,会返回一个403,并提示用户登录.
c.如果这个方法标注了具体需要某种权限,如@Auth("authority"),就要求用户必须有这种权限,否则返回403,并提示用户没有权限,这里相当于实现授权,并且授权之前先认证.
3.让拦截器起作用.重写org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addInterceptors方法
- @Configuration
- @ComponentScan(basePackages={"org.exam.web"})
- @EnableWebMvc
- public class MvcConfig extends WebMvcConfigurerAdapter{
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(new AuthInterceptor());
- }
- //其它略...
- }
4.用户登录(只做了一个模拟登录)和具体使用,剩下的就可以测试了.
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @RequestMapping("/login")
- @ResponseBody
- public boolean login(HttpSession session,User user){
- boolean result=false;
- //模拟从数据库查出存在这样的用户
- Long userId=user.getId();
- if(userId!=null&&userId>0){
- session.setAttribute(AuthInterceptor.SESSION_USERID, userId);
- session.setAttribute(AuthInterceptor.SESSION_AUTHS, new HashSet<String>(Arrays.asList("user_list", "user_query", "user_save")));
- result=true;
- }
- return result;
- }
- @Auth("user_queryXXXX")
- @RequestMapping("/query")
- @ResponseBody
- public String query(){
- System.out.println("query");
- return getClass().toString();
- }
- @Auth("user_list")
- @RequestMapping("/list")
- @ResponseBody
- public String list(){
- System.out.println("list");
- return getClass().toString();
- }
- @Auth("user_save")
- @RequestMapping("/add")
- public String add(User user){
- System.out.println("add:"+user);
- return "user/add";
- }
- }
相关推荐
SpringMVC+Mybatis整合实现简单权限控制系统代码
基于SpringSecurity+springMVC+mybatis+mysql实现。基于SpringSecurity权限控制的简单工程DEMO。maven构建,用户信息存储在mysq数据库中
SpringMVC+Mybatis整合实现简单权限控制系统代码
2. **安全性高:** 平台采用了严格的权限控制和数据加密机制,保障用户信息和交易安全。 3. **用户友好:** 平台界面简洁清晰,操作简单直观,用户可以快速上手使用各项功能。 4. **实时通知:** 平台支持实时通知...
基于springMVC+mybatis+mysql实现。基于SpringSecurity权限控制的简单工程DEMO。maven构建.
四、简单实现了单个帐号只能在一处登录。 我们在其他的系统中可以看到,单个帐号只允许一人使用,在A处登录了,B处再登录,那A处就被踢出了。如下图所示。 但是此功能不是很完美,当A处被踢出后,再重新登录,这...
springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存,quartz定时任务(没有具体业务实现)等技术点都在项目中实现了,可谓是麻雀虽小五脏俱全!...
springMVC+hibernate全注解实现的简易自动化办公系统(OA),实现功能有文件的上传、下载、MVC控制器控制权限、JSON的使用等,使用ORALCE数据库,包含建表语句,更改用户名及密码即可运行。
基于SpringSecurity+springMVC+mybatis+mysql实现。基于SpringSecurity权限控制的简单工程DEMO。maven构建,用户信息存储在mysq数据库中。
动态配置权限,角色和资源,权限控制到按钮粒度 采用token进行权限校验,禁用session,未登录返回401,权限不足返回403 采用redis存储token及权限信息 内置功能: 用户管理:用户查询、添加用户、修改用户、给...
基于SpringMVC+Shiro+Activiti 5.16 的简单OA,...Shiro实现登录认证和权限控制,结合Ehcache缓存权限列表,毕竟权限表并不是总在变化。 用户在线列表,可以强制踢出。Shiro的密码的加密解密,并发登陆、会话管理等功能
灵活的权限控制,可控制到页面或按钮,满足绝大部分的权限需求 完善的部门管理及数据权限,通过注解实现数据权限的控制 完善的XSS防范及脚本过滤,彻底杜绝XSS攻击 支持分布式部署,session存储在redis中 友好的...
实现简单登录、简单权限控制
JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流引擎。 JeeSite主要定位于企业信息化领域,...
通过jstl标签来实现管理员的权限控制,将某些需要超级管理员权限的功能按钮进行标签校验是否显示。 通过POI技术实现将考试成绩记录以excel的格式保存到本地。 通过JFreeChart技术实现将各科成绩进行统计,并以...
界面设计美观大方、操作简单。功能完善、结构清晰。能够实现前台新书上架功能。能够实现前台新书分类功能。能够实现前台购物车功能。能够实现后台用户管理。能够实现后台订单管理。能够实现后台图书管理。 操作注意...
严格的权限控制,当然你也可以自己扩展.. 采用redis作为主键生成策略,无序考虑主键策略,且通用性相当不错.-- AOP加注解方式记录日志,日志内容清晰,记录方式简单.-- 简单易用的导出配置,助你5分钟实现导出,详见底部 ...
界面设计美观大方、操作简单。功能完善、结构清晰。能够实现前台新书上架功能。能够实现前台新书分类功能。能够实现前台购物车功能。能够实现后台用户管理。能够实现后台订单管理。能够实现后台图书管理。 操作注意...
数据安全与权限控制:系统采取数据加密和权限控制等安全措施,确保数据的安全性和隐私保护。 界面友好:系统具有直观、友好的用户界面和良好的用户体验,操作简单易懂,提供便捷的图书销售管理流程。 总之,基于...
随笔简介 1、spring版本:4.3.2.RELEASE+spring security 版本:4.1.2.RELEASE(其它不做说明) ...这个过程中应该还带有权限角色,并且贯穿整个会话。有了这个思路,我们只需要把数据库的用户名密码交给spring