shiro 不执行授权方法 doGetAuthorizationInfo()

问题描述

shiro 不执行授权方法 doGetAuthorizationInfo()

ShiroDbRealm.java 代码如下

public class ShiroDbRealm extends AuthorizingRealm {

    @Resource
    private UserService userService;

    /**
     * 认证回调函数,登录时调用.
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
        User currentUser = userService.findByUserName(token.getUsername());
        if (currentUser != null) {
            if (currentUser.getStatus()==User.STATUS_DISABLED) {
                throw new DisabledAccountException("用户已注销");
            }else if(currentUser.getStatus()==User.STATUS_NOT_ACTIVE){
                throw new DisabledAccountException("用户未激活");//这里需要编写一个用户未激活异常
            }
            return new SimpleAuthenticationInfo(currentUser.getUsername(),currentUser.getUserpwd(), "");
        }
        return null;
    }

    /**
     * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        // Cache<Object, AuthenticationInfo> authenticationCache =
        // getAuthenticationCache();
        String primaryPrincipal = (String) principals.getPrimaryPrincipal();
        System.out.println("-----------*************************------------>"+ primaryPrincipal);
        List<String> roles = new ArrayList<String>();
        List<String> permissions = new ArrayList<String>();

        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

        User user = userService.findByUserName(primaryPrincipal);
        if(user != null){
            for (Role role : user.getRoles()) {
                roles.add(role.getName());
                for (Permission p : role.getPermissions()) {
                    permissions.add(p.getPrivilege());
                }
            }
        }else{
            throw new AuthorizationException();
        }
        //给当前用户设置角色
        info.addRoles(roles);
        //给当前用户设置权限
        info.addStringPermissions(permissions); 

        return info;
    }
}

applicationContext-shiro.xml配置

 <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

    <description>Shiro安全配置</description>

    <!-- Shiro's main business-tier object for web-enabled applications -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="shiroDbRealm"/>
        <property name="cacheManager" ref="shiroEhcacheManager"/>
    </bean>

    <!-- 項目自定义的Realm -->
    <bean id="shiroDbRealm" class="com.wsq.app.service.common.ShiroDbRealm">
        <!-- <property name="userService" ref="userService"/>  这里我在项目中只用了注解注入-->
    </bean>

    <!-- Shiro Filter -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 这个属性是必须的 -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面 -->
        <property name="loginUrl" value="/login"/>
        <!-- 登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此 -->
        <property name="successUrl" value="/"/>
        <!-- 没有权限默认跳转的页面 -->
        <property name="unauthorizedUrl" value=""/>
        <!-- 就是需要验证的地址的列表,常用的包含anon、authc、perms、roles、user、logout。 -->
        <property name="filterChainDefinitions">
            <value>
                /static/** = anon
                /login = anon
                /login/** = anon
                /logout = user
                /** = authc
            </value>
        </property>
    </bean>

    <!-- 用户授权信息Cache, 采用EhCache -->
    <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:resource/ehcache-shiro.xml"/>
    </bean>

    <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <!-- AOP式方法级权限检查  -->
    <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>

</beans>

web.xml配置

  <!-- Shiro Security filter -->
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

集成以后,项目可以正常启动,登陆时也可以正常调用登录验证,可就是在验证授权时,不掉用。求解答~也没分了,不好意思。

解决方案

最近我也遇到这个问题,不知道楼主是否有解决,有的话还忘分享下,谢谢!

解决方案二:

我也是这个问题,授权的方法不调用,之前都要调用的,不知道现在怎么不调用了,也没有异常抛出来,不知道你们解决没有

解决方案三:

参考一下:

 http://www.oschina.net/question/273295_105031

解决方案四:

在spring-mvc的配置文件中,添加

 <aop:config proxy-target-class="true"></aop:config>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>

启动shiro授权注解拦截方式,就可以了
另外这个还需要aspectj的支持

 <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj.version}</version>
        </dependency>

解决方案五:

楼主的问题解决了吗?我也遇到了这个问题,登录后台都成功了,跳转进入时就又回到登录页面了。怎么回事呢???

解决方案六:

/**
* 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.
*/
清缓存

解决方案七:

楼主的问题解决了吗?我也遇到了这个问题,登录后台都成功了,跳转进入时就又回到登录页面了。怎么回事呢???

时间: 2024-09-12 21:34:05

shiro 不执行授权方法 doGetAuthorizationInfo()的相关文章

shiro不执行认证方法 不调用自定义的doGetAuthenticationInfo方法

问题描述 shiro不执行认证方法 不调用自定义的doGetAuthenticationInfo方法 在访问认证路径时 String exceptionClassName = (String) request.getAttribute(""shiroLoginFailure""); 在这直接路过 不去调用自定的realm 解决方案 http://www.oschina.net/question/273295_105031

应用-微信登陆分享点击留在微信,不能执行回调方法

问题描述 微信登陆分享点击留在微信,不能执行回调方法 使用微信的分享SDK,集成后分享成功后点击返回原应用和留在微信中的留在微信按钮, 无法收到回调就执行不了写好的逻辑代码,怎么解决? 解决方案 sharesdk 微信登陆分享点击留在微信回调解决方案

当spring 容器初始化完成后执行某个方法

在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出哪个文件的xml文件使用了这个函数. 而在Spring的web项目中,我们可以介入Spring的启动过程.我们希望在Spring容器将所有的Bean都初始化完成之后,做一些操作,这个时候我们就可以实现一个接口: 1 2 3 4 5 6 7 package com.yk.test.executor.p

jquery单击事件执行后台方法提前执行的问题

问题描述 jquery单击事件执行后台方法提前执行的问题 我在主页末尾添加javascript代码如下: $(function(){ $(".fouct1:first").click(function(){ var a=<%=ServerIpAdd()%>; //执行一个后台方法 }); }); 可是,每次刷新页面就执行了ServerIpAdd()方法,而不是单击事件后执行ServerIpAdd()方法(记录单击特定链接的次数),请高手提供一个好的方法,实现单击某个链接以后

高招 Windows 7下不让病毒执行的方法

  常听到一些"比较专业"的IT人员说,"使用者装了防毒软件也就算了,但是一点防毒的概念都没有,以为这样就不会中毒吗?" 要想不中毒,更重要的是,要更进一步了解病毒的运作原理,以及防毒软件的保全之道.在这里,希望对于一般企业的计算机使用者,能提供一些够用的"防毒概念".也许不能"保证"什么,但至少你对于计算机发生的事情能够有个梗概性的认识吧! 精巧脆弱的开机程序 用计算机都得先开机,从打开电源一直到操作系统加载完成,这就是俗称

中止javascript执行的方法

  本篇文章主要是对中止javascript执行的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 JS没有PHP的exit, 也没有JAVA的return. 如果JS代码不是函数,则需要中止JS执行时,只有一个办法,那就是: document.location.href=your_url; 此外,throw虽能中止,但仍是不友好的出错信息,所以,如果想友好中止,只能是以上方法. 因此,非函数模式的代码,是无法停留在当前页面实现中止的.  

python文件读写操作与linux shell变量命令交互执行的方法_python

本文实例讲述了python文件读写操作与linux shell变量命令交互执行的方法.分享给大家供大家参考.具体如下: python对文件的读写还是挺方便的,与linux shell的交互变量需要转换一下才能用,这比较头疼. 代码如下: 复制代码 代码如下: #coding=utf-8 #!/usr/bin/python import os import time #python执行linux命令 os.system(':>./aa.py') #人机交互输入 S = raw_input("

安卓中如何让Viewpager无论怎样滑动每次都重新执行onCreateView方法?????

问题描述 安卓中如何让Viewpager无论怎样滑动每次都重新执行onCreateView方法????? 也就是让viewpager不缓存界面,试过利用反射改变viewPgar中的一个属性,因为设置缓存数量的方法最少是1,

service-创建一个服务,重复执行某个方法

问题描述 创建一个服务,重复执行某个方法 我创建了一个服务器,每5分钟运行一次.但是当程序执行到while(true),就会报错.我估计这是不允许的.有什么更好的方法能重复执行某一个方法呢? public class repService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } while(true){