`
zzc1684
  • 浏览: 1224844 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

spring shiro权限注解方式验证

阅读更多

第一种使用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 shiro整合入门

    Spring框架作为Java领域最流行的框架之一,提供了丰富的功能,而Apache Shiro则是一款强大的安全管理框架,专注于身份验证、授权和会话管理。将Spring与Shiro进行整合,可以构建出高效且灵活的安全管理体系。本文将...

    SpringBoot 、Shiro、 自定义注解权限控制源码下载

    4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@RequiresPermissions、@RequiresRoles等。 5. **MyBatis Plus的使用**:学习如何创建实体类、Mapper接口,以及如何编写Mapper XML文件来实现数据...

    39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发而闻名,而Shiro则是一个轻量级的安全框架,适用于身份验证、授权、会话管理和安全性相关的...

    spring mvc整合shiro登录 权限验证实例下载

    本文将详细介绍如何整合Spring MVC与Shiro进行用户登录、注销以及权限验证的实例。 首先,Spring MVC是Spring框架的一部分,它提供了一种模型驱动的开发方式,使得开发者可以更方便地构建RESTful的Web服务。它的...

    spring+shiro权限整合

    5. 权限注解:在Spring MVC的Controller方法上使用Shiro的权限注解,如@RequiresAuthentication、@RequiresRoles、@RequiresPermissions等,实现基于注解的权限控制。 6. Session管理:集成Shiro的Session管理,...

    Spring整合Shiro做权限控制模块详细案例分析

    Spring 整合 Apache Shiro 是一个常见的权限控制解决方案,它可以帮助开发者轻松地实现用户登录、权限验证、会话管理等功能。在这个案例中,我们将深入探讨如何将 Shiro 与 Spring 结合使用,构建一个完整的权限控制...

    跟我学Shiro第12章Demo(仅JAVA SE+Web+Shiro权限注解)2

    《跟我学Shiro第12章Demo:Java SE+Web+Shiro权限注解实践》 Shiro是一款强大的安全管理框架,适用于Java环境中的身份验证、授权、会话管理和加密等功能。在第12章的Demo中,我们主要探讨的是如何在Java SE(标准版...

    shiro+spirngmvc 验证 IntelliJ IDEA

    在本文中,我们将深入探讨如何在Java Web项目中结合Spring MVC和Apache Shiro进行角色与权限验证的开发。首先,让我们了解这两个关键组件。 **Spring MVC** Spring MVC是Spring框架的一部分,是一个强大的Model-...

    springboot shiro 权限管理 spring boot

    通过这个示例项目,开发者可以学习到如何将 Shiro 集成到 Spring Boot 应用中,理解它们之间的交互方式,并实际操作权限管理的各种场景。这将对提升开发者的技能,尤其是在企业级应用开发中处理安全性问题方面,有着...

    spring+shiro+ehcache例子

    登录名为2:可以进行权限的验证,以及shiro的缓存。 登录名为任意用户:可以验证mycache的缓存。 缓存的验证都是观察控制台的输出信息 此项目有shiro验证码的实现,更改用户userState状态可以实现用户锁定,密码...

    ssm-shiro权限管理(一)

    SSM-Shiro权限管理是Java Web开发中一种常见的权限控制框架集成方案,它结合了Spring、SpringMVC、MyBatis以及Apache Shiro这四个组件,实现了一个完整的权限管理系统。在本文中,我们将深入探讨如何将这四个组件...

    spring-shiro-training-master.zip_guide8go_shiro_spring_spring 权限

    此外,Spring-MVC和Shiro的集成可以让我们在控制器方法上添加注解,实现基于方法的权限控制。例如,`@RequiresPermissions`、`@RequiresRoles` 和 `@RequiresUser` 注解分别用于检查用户是否具有特定的权限、角色...

    shiro实现授权登陆验证

    - Shiro提供了注解`@RequiresRoles`和`@RequiresPermissions`,可以直接在方法上标记,实现基于注解的权限控制。 - 也可以通过编程式的方式,如`Subject.checkRole()`和`Subject.checkPermission()`来进行动态权限...

    Spring MVC+mybatis+easyui+ueditor+shiro权限框架管理系统

    在实际项目中,这些组件协同工作,Spring MVC负责接收和转发请求,MyBatis处理数据库操作,EasyUI和UEditor负责前端展示和交互,而Shiro则负责用户的身份验证和权限控制。开发者通过集成这些组件,可以快速搭建起一...

    ssm+shiro权限框架

    SSM+Shiro权限框架是Java Web开发中常用的一种安全控制解决方案,主要结合了Spring、Spring MVC、MyBatis和Apache Shiro四个组件。这个框架提供了全面的权限管理功能,包括用户认证、授权、会话管理和安全性日志等。...

    Springboot+shiro权限管理

    Spring Boot 和 Apache Shiro 的结合提供了一种优雅的方式来实现这一目标。本文将深入探讨"Springboot+shiro权限管理"的主题,旨在提供最详尽、最清晰的理解路径。 首先,Spring Boot 是一个基于 Spring 框架的轻量...

    springMVC+hibernate+spring+shiro整合例子

    4. **配置Shiro**:定义Realm,实现身份验证和授权逻辑,配置ShiroFilter,以控制哪些URL需要登录权限,哪些URL需要特定的角色或权限。 5. **整合步骤**:在Spring配置中引入Hibernate和Shiro的相关bean,确保它们...

    springShiro.zip

    本教程将围绕“springShiro.zip”这个项目,详细解析如何在SpringBoot应用中集成Mybatis和Shiro,实现数据库连接以及粗粒度的权限管理。 首先,让我们了解SpringBoot。SpringBoot是Spring框架的一个扩展,旨在简化...

    shiro spring mvc权限管理

    - Spring的AOP(面向切面编程)使得Shiro能方便地进行权限拦截,通过注解或配置文件定义权限规则。 - 使用`@Autowired`注解将Shiro的`SecurityManager`注入到Spring的Bean中,实现统一管理。 3. **Shiro的核心...

Global site tag (gtag.js) - Google Analytics