第一种使用shiro的注解方式:
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"> <property name="proxyTargetClass" value="true" /> </bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>
配置上,在方法头上加上注解就可以了,网上资料很多,就不详说了
使用自定义注解
先上自定义注解:
package com.isoftstone.common.permission; 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 CheckPermission { String [] permission();//可以传多个权限标示 }
注解使用:
/** * 保存 * @param 基本用户信息 * @param 角色id * @return * @author {huzhe} */ @RequestMapping(value = "/saveUser") @CheckPermission(permission={BusinessPermissionLabel.permission_addChildAccount}) public OperationPrompt saveUser(UserBasicInfo userbaseInfo,String addRoleIds) {
多个权限标示使用逗号隔开;
第二种:使用spring aop 方法验证 基于上边的自定义
使用shiro验证是否标示是否有权限
currentUser.isPermitted(per)
package com.isoftstone.common.permission; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.subject.Subject; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component //次方法根据spring aop贴入方法 进行权限验证 public class PermissionInterceptor { @Around("execution(* com.isoftstone.dcf.portal..*(..)) && @annotation(checkPermission)") public Object doInterceptor(ProceedingJoinPoint pjp,CheckPermission checkPermission) throws Throwable{ long time = new java.util.Date().getTime(); boolean isPermissioin = false; Subject currentUser = SecurityUtils.getSubject(); //没有获得注解 及不需要权限-- 则直接运行 if(null!=checkPermission){ String [] permission = checkPermission.permission(); for(String per:permission){ //当前登录人 具有权限 if(currentUser.isPermitted(per)){ isPermissioin = true; break; } } }else{ isPermissioin = true; } System.out.println("(AOP)拦截到了:"+pjp.getSignature().getName()+"方法所用时间:"+time+"到"+new java.util.Date().getTime()); if(isPermissioin){ //有执行方法或权限不拦截 return pjp.proceed(); }else{ //抛出无权限异常 throw new AuthorizationException(); } } }
需要在spring配置文件中开始aop注解:
<!-- 打开aop使用aop进行权限验证 --> <aop:aspectj-autoproxy />
方式3:使用spring mvc拦截所有url验证:
<!-- 使用spring mvc拦截器进行权限验证 --> <mvc:interceptors> <bean class="com.isoftstone.common.permission.PermissionInterceptorAdapter" /> </mvc:interceptors>
这个方法实现大致一样:
package com.isoftstone.common.permission; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.subject.Subject; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; //次方法根据spring mvc拦截器进行权限验证 public class PermissionInterceptorAdapter extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handler2=(HandlerMethod) handler; CheckPermission checkPermission = handler2.getMethodAnnotation(CheckPermission.class); long time = new java.util.Date().getTime(); boolean isPermissioin = false; Subject currentUser = SecurityUtils.getSubject(); //没有获得注解 及不需要权限-- 则直接运行 if(null!=checkPermission){ String [] permission = checkPermission.permission(); for(String per:permission){ //当前登录人 具有权限 if(currentUser.isPermitted(per)){ isPermissioin = true; break; } } }else{ isPermissioin = true; } System.out.println("拦截到了mvc方法:"+handler2.getMethod()+"方法所用时间:"+time+"到"+new java.util.Date().getTime()); if(isPermissioin){ //有执行方法或权限不拦截 return true; }else{ //跑出无权限异常 throw new AuthorizationException(); } } }
除了spring和shiro使用的包:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.0</version> </dependency>
spring自定义异常拦截:
package com.isoftstone.common.exception; import java.io.IOException; import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.UnauthorizedException; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import com.isoftstone.common.bo.PermissioinPage; /** * 自定义权限异常处理 * @author Administrator * */ @Component public class MyHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) { //是否为ajax请求 String requestType = request.getHeader("X-Requested-With"); if(exception instanceof AuthorizationException){ response.setStatus(413);//无权限异常 主要用于ajax请求返回 response.addHeader("Error-Json", "{code:413,msg:'nopermission',script:''}"); response.setContentType("text/html;charset=utf-8"); if("XMLHttpRequest".equals(requestType)){ return new ModelAndView(); } return new ModelAndView("redirect:/html/413.html"); } return null; }
相关推荐
登录名为2:可以进行权限的验证,以及shiro的缓存。 登录名为任意用户:可以验证mycache的缓存。 缓存的验证都是观察控制台的输出信息 此项目有shiro验证码的实现,更改用户userState状态可以实现用户锁定,密码...
-- 异常处理,权限注解会抛出异常,根据异常返回相应页面 --> class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <prop key="org.apache.shiro.authz....
-- 异常处理,权限注解会抛出异常,根据异常返回相应页面 --> class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <prop key="org.apache.shiro.authz....
Spring Boot-Shiro-Vue 提供一套基于SpringBoot-shiro-vue的权限管理思路. 前后端都加以控制,做到按钮/接口级别的权限 DEMO 测试地址 admin/123456 管理员身份登录,可以新增用户,角色. 角色可以分配权限 控制菜单...
尚硅谷_Shiro_权限注解 · 22.尚硅谷_Shiro_从数据表中初始化资源和权限 · 23.尚硅谷_Shiro_会话管理 · 24. 尚硅谷_Shiro_SessionDao · 25.尚硅谷_Shiro_缓存 · 26.尚硅谷_Shiro_认证和记住我的区别 · 27...
Spring Boot-Shiro-Vue 提供一套基于SpringBoot-shiro-vue的权限管理思路. 前后端都加以控制,做到按钮/接口级别的权限 DEMO admin/123456 管理员身份登录,可以新增用户,角色. 角色可以分配权限 控制菜单是否显示,...
采用的是maven管理工程 项目架构是 springmvc4.2.4.RELEASE+spring4.2.4.RELEASE+shiro1.22+hibernate5.1.0.Final 前端框架采用的是bootstrap 实现了角色+权限+用户的控制,另外为了能够更好的查看效果我加了一个实体...
基于 RBAC新解 . 通常我们的权限设计都是 用户--角色--权限 ,其中角色是我们写代码的人没法...角色的作用其实只是用来管理分配权限的,真正的验证只验证权限 ,而不去管你是否是那种角色.体现在代码上就是接口上注解为
springboots整合shiro验证,实现登录以及记住密码,并实现通过Redis缓存记住登录状态,同时对用户权限进行控制demo。包括前端shiro标签和后台注解两种验证方式。
Shiro(Apache Shiro)是一个强大且易于使用的Java安全框架,用于身份验证、授权、...容器友好:Shiro可以与常见的Java容器(如Spring、Guice)以及其他框架(如Apache Struts、Apache Wicket)进行集成,方便开发者
Spring Boot-Shiro-Vue 提供一套基于SpringBoot-shiro-vue的权限管理思路. 前后端都加以控制,做到按钮/接口级别的权限 DEMO admin/123456 管理员身份登录,可以新增用户,角色. 角色可以分配权限 控制菜单是否显示,...
shiro权限控制;静态资源,“ /”映射服务启动注册到consul;并测试获取redis服务,初始化redis资源; consul监控redis服务; reids分布式锁;注意consul客户端和consul程序版本问题SPI机制:org / windwant / ...
使用apache-shiro作为安全登录及权限验证框架 使用fastjson作数据处理 使用slf4j+log4j做日志记录 使用druid做连接池及监控 采用mysql作为数据库 使用kaptcha并二次开发作为验证码 使用maven作为jar管理 使用redis...
shiro:Apache开源权限管理框架,包括登录验证,授权,加密,会话管理 redis:Nosql数据库,搭配shiro的会话管理功能将session存入redis中,实现tomcat多服务器集群的session共享 nginx:反向代理服务器,...
核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。 互联网云快速开发框架,微服务分布式代码生成的敏捷开发系统架构。项目代码简洁,注释丰富,上手容易,还同时集中分布式、微服务,同时包含许多基础模块和监控...
包括aop,自定义注释解,springmvc,jpa + hibernate,springlistener,@预定定时任务,过滤器的简单实用,包括简单的登录权限验证,设备crud功能cloud模块没得说,主要是亲手建造一整套springcloud服务,包括常用的...
代码生成前端界面、底层代码(spring mvc、mybatis、Spring boot、Spring Cloud、微服务的生成)、安全框架、视图框架、服务端验证、任务调度、持久层框架、数据库连接池、缓存框架、日志管理、IM等核心技术。...
4. 自动运行SQL脚本,关闭请注释掉 **spring.datasource.schema**。 5. 默认登录 **admin/admin** 6. 打印后台 SQL 语句。 (打开/关闭 注释该方法 com.zyf.framework.config.MybatisAutoConfiguration.pageHelper)...
核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。 互联网云快速开发框架,微服务分布式代码生成的敏捷开发系统架构。项目代码简洁,注释丰富,上手容易,还同时集中分布式、微服务,同时包含许多基础模块和监控...
身份验证/访问权限使用jwt与spring-security结合实现(旧版使用shiro,但其注解不够灵活,改用security) 多数据源mybatis静态多数据源,每个数据源独立配置方便增减,每个数据源独立事务管理器,每个数据源对应指定...