自己动手实现简单权限控制
来源:互联网 发布:linux recovery mode 编辑:程序博客网 时间:2024/05/18 18:55
web 权限控制,很多项目会引入 shiro/spring-security。
shiro/spring-security 继承 servlet-->filter抽象接口,运用合适的设计模式,
通过拦截客户端请求,来实现各个角色对系统资源的访问权限。
一时兴起,有了自己实现权限控制的想法,遂有此文,如果你用腻了 shiro/spring-security,不妨来和我一起完善它。
本文只做抛砖引玉之用,重点在思路,具体项目具体编程语言请自行拿捏。
Git Demo:htt ps://git. osch ina.net/Lanb oEx/simple-auth-demo
Shiro 中定义拦截过滤链,可以很简单实现上图中的想法,像下面这种姿势(但咱的目的是自己动手)。
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> ............ <!-- 过滤链定义 --> <property name="filterChainDefinitions"> <value> <!--anno:AnonymousFilter 不需要任何权限即可访问--> /login.jsp* = anon /login.do* = anon <!--authc:FormAuthenticationFilter 表单验证权限--> /pages/* = authc /index.jsp* = authc <!--perms:PermissionsAuthorizationFilter 指定授权访问--> /role/edit/* = perms[role:edit] /role/save = perms[role:edit] /role/list = perms[role:view] </value> </property> </bean>
想法大致和 shiro/spring-security 相同,实现 Filter 接口拦截客户端的对应请求。
比较有意思的部分,首先你得确定该 Filter 需要拦截什么的请求,服务? 静态页面 ? 交互脚本?网页样式?图片?
当然项目需要有良好的命名规范,无论是 restful 风格或传统风格。规范项目中的请求 URL 或添加特定的后缀。web.xml 配置比如像下面。
<filter> <filter-name>simpleAuthFilter</filter-name> <filter-class>com.rambo.sad.SimpleAuthFilter</filter-class> <init-param> <param-name>defaultPage</param-name> <param-value>/view/login.jsp</param-value> </init-param> <init-param> <param-name>freeServices</param-name> <param-value> /view/login.jsp,login.do <!--登录相关--> </param-value> </init-param> </filter> <filter-mapping> <filter-name>simpleAuthFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>simpleAuthFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
其次你需要确定该本次请求是否有访问该资源的权限,我项目中确定逻辑比较简单,毕竟千人系统。
将登录页面和登录请求做为 FreeService ,也就是暴露在系统外的资源,登录时在 Session 中放置对应登录对象 PO。
既方便系统内的相应展示,也可做为用户是否登录的凭证,比如登录服务逻辑像下面。
@RequestMapping("/login.do") public String login(HttpSession httpSession, UserPO userPO) { logger.info("login name:" + userPO.getName() + ",pwd:" + userPO.getPasswd()); //一些必要的系统前置工作..... httpSession.setAttribute("user", userPO); return "success"; }
当然也可以引入数据库设计,划分用户角色来制定详细的访问策略。
最后继承 Filter 接口拦截每次客户端请求,来决定是否能获取到对应的系统资源。
defaultPage 为权限不足时默认跳转的页面,比如 Filter doFilter方法逻辑像下面。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws Exception{ HttpServletRequest request = (HttpServletRequest) servletRequest; HttpSession session = request.getSession(false);
if ((session == null || session.getAttribute("user") == null) && !isFreeService(request.getRequestURI())) { request.setAttribute("SESSIONFILTER_MSG", "LOGIN_TIMEOUT"); request.getRequestDispatcher(defaultPage).forward(servletRequest, servletResponse);return; } filterChain.doFilter(servletRequest, servletResponse); }
- 自己动手实现简单权限控制
- 自己动手实现简单权限控制
- 自己动手实现简单权限控制
- 自己动手实现简单权限控制_0
- springmvc简单实现权限控制
- 自己动手简单实现CountDownLatch
- 简单客户系统的权限控制实现
- 简单客户系统的权限控制实现
- ASP.NET 实现简单的权限控制
- MVC 权限控制 Authorize Roles 简单实现
- 简单的if else 实现权限控制
- Delphi简单权限控制
- 简单的权限控制
- TreeView加载不同sitemap文件实现简单权限控制
- 基于struts的权限控制——简单实现
- CodeIgniter通过hook的方式实现简单的权限控制
- ASP.NET MVC中权限控制的简单实现
- CodeIgniter通过hook的方式实现简单的权限控制
- Spark-特征抽取(TF-IDF)
- 辩论2如何说服聪明人
- php命名空间:非限定名称、限定名称、完全限定名称实例详解
- YouTube 有一套专属于自己的字体了,据说灵感来自“播放键”
- AlertDialog弹框和ProgressDialog下载进度框
- 自己动手实现简单权限控制
- mybatis入门实例
- 2017.05.23回顾 python引用赋值 reset_index pd.concat
- g2o: 如何使用g2o的例子
- Angularjs按需加载学习链接
- OSGI开发(三)
- 正确区分relative 和 absolute
- Type interface mapper.XxxMapper is not known to the MapperRegistry.
- 定义锚点,点击a标签跳转到相应的版块,使页面滚动产生效果