第一种使用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; }
相关推荐
Spring框架作为Java领域最流行的框架之一,提供了丰富的功能,而Apache Shiro则是一款强大的安全管理框架,专注于身份验证、授权和会话管理。将Spring与Shiro进行整合,可以构建出高效且灵活的安全管理体系。本文将...
4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@RequiresPermissions、@RequiresRoles等。 5. **MyBatis Plus的使用**:学习如何创建实体类、Mapper接口,以及如何编写Mapper XML文件来实现数据...
在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发而闻名,而Shiro则是一个轻量级的安全框架,适用于身份验证、授权、会话管理和安全性相关的...
本文将详细介绍如何整合Spring MVC与Shiro进行用户登录、注销以及权限验证的实例。 首先,Spring MVC是Spring框架的一部分,它提供了一种模型驱动的开发方式,使得开发者可以更方便地构建RESTful的Web服务。它的...
5. 权限注解:在Spring MVC的Controller方法上使用Shiro的权限注解,如@RequiresAuthentication、@RequiresRoles、@RequiresPermissions等,实现基于注解的权限控制。 6. Session管理:集成Shiro的Session管理,...
Spring 整合 Apache Shiro 是一个常见的权限控制解决方案,它可以帮助开发者轻松地实现用户登录、权限验证、会话管理等功能。在这个案例中,我们将深入探讨如何将 Shiro 与 Spring 结合使用,构建一个完整的权限控制...
《跟我学Shiro第12章Demo:Java SE+Web+Shiro权限注解实践》 Shiro是一款强大的安全管理框架,适用于Java环境中的身份验证、授权、会话管理和加密等功能。在第12章的Demo中,我们主要探讨的是如何在Java SE(标准版...
在本文中,我们将深入探讨如何在Java Web项目中结合Spring MVC和Apache Shiro进行角色与权限验证的开发。首先,让我们了解这两个关键组件。 **Spring MVC** Spring MVC是Spring框架的一部分,是一个强大的Model-...
通过这个示例项目,开发者可以学习到如何将 Shiro 集成到 Spring Boot 应用中,理解它们之间的交互方式,并实际操作权限管理的各种场景。这将对提升开发者的技能,尤其是在企业级应用开发中处理安全性问题方面,有着...
登录名为2:可以进行权限的验证,以及shiro的缓存。 登录名为任意用户:可以验证mycache的缓存。 缓存的验证都是观察控制台的输出信息 此项目有shiro验证码的实现,更改用户userState状态可以实现用户锁定,密码...
SSM-Shiro权限管理是Java Web开发中一种常见的权限控制框架集成方案,它结合了Spring、SpringMVC、MyBatis以及Apache Shiro这四个组件,实现了一个完整的权限管理系统。在本文中,我们将深入探讨如何将这四个组件...
此外,Spring-MVC和Shiro的集成可以让我们在控制器方法上添加注解,实现基于方法的权限控制。例如,`@RequiresPermissions`、`@RequiresRoles` 和 `@RequiresUser` 注解分别用于检查用户是否具有特定的权限、角色...
- Shiro提供了注解`@RequiresRoles`和`@RequiresPermissions`,可以直接在方法上标记,实现基于注解的权限控制。 - 也可以通过编程式的方式,如`Subject.checkRole()`和`Subject.checkPermission()`来进行动态权限...
在实际项目中,这些组件协同工作,Spring MVC负责接收和转发请求,MyBatis处理数据库操作,EasyUI和UEditor负责前端展示和交互,而Shiro则负责用户的身份验证和权限控制。开发者通过集成这些组件,可以快速搭建起一...
SSM+Shiro权限框架是Java Web开发中常用的一种安全控制解决方案,主要结合了Spring、Spring MVC、MyBatis和Apache Shiro四个组件。这个框架提供了全面的权限管理功能,包括用户认证、授权、会话管理和安全性日志等。...
Spring Boot 和 Apache Shiro 的结合提供了一种优雅的方式来实现这一目标。本文将深入探讨"Springboot+shiro权限管理"的主题,旨在提供最详尽、最清晰的理解路径。 首先,Spring Boot 是一个基于 Spring 框架的轻量...
4. **配置Shiro**:定义Realm,实现身份验证和授权逻辑,配置ShiroFilter,以控制哪些URL需要登录权限,哪些URL需要特定的角色或权限。 5. **整合步骤**:在Spring配置中引入Hibernate和Shiro的相关bean,确保它们...
本教程将围绕“springShiro.zip”这个项目,详细解析如何在SpringBoot应用中集成Mybatis和Shiro,实现数据库连接以及粗粒度的权限管理。 首先,让我们了解SpringBoot。SpringBoot是Spring框架的一个扩展,旨在简化...
- Spring的AOP(面向切面编程)使得Shiro能方便地进行权限拦截,通过注解或配置文件定义权限规则。 - 使用`@Autowired`注解将Shiro的`SecurityManager`注入到Spring的Bean中,实现统一管理。 3. **Shiro的核心...