`

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>


在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>


参考:http://ask.csdn.net/questions/201357
分享到:
评论

相关推荐

    shiro认证及授权demo

    6. **授权控制**:在Controller或Service层,可以使用Shiro的`Subject.hasRole`和`Subject.isPermitted`方法检查用户是否拥有某个角色或权限,根据结果决定是否允许执行相应操作。 7. **异常处理**:Shiro的认证和...

    springboot+Shiro 实现动态授权

    这个类会继承自`AuthorizingRealm`,并覆盖`doGetAuthenticationInfo`和`doGetAuthorizationInfo`方法,以获取用户的认证和授权信息。例如,你可以使用MyBatis查询数据库中的用户信息: ```java public class ...

    shiro认证和授权案例

    2. **自定义 Realm 类**:继承自Shiro的AuthorizingRealm,重写doGetAuthenticationInfo()和doGetAuthorizationInfo()方法,从数据源中获取并处理认证和授权信息。 3. **登录控制器**:接收用户登录请求,创建...

    shiro授权 shiro和企业项目整合开发

    Shiro 的授权(Authorization)主要负责确定用户是否有权限执行某个操作。这通过角色(Role)和权限(Permission)来实现。角色是权限的集合,而权限则定义了用户可以做什么。例如,一个“管理员”角色可能包含了...

    shiro权限认证和授权

    - ** Realm**: Realm是Shiro与应用程序数据源的桥梁,负责获取用户凭证并验证,以及执行授权检查。 - ** SecurityManager**:它是Shiro的核心,管理所有的安全组件,并协调它们的工作。 ### 四、Shiro的会话管理 ...

    Shiro安全登录认证、权限授权封装模块代码

    使用 MyBatis 作为持久层,你需要创建一个 Realm 类,该类继承自 `AuthorizingRealm`,并覆盖其 `doGetAuthenticationInfo()` 和 `doGetAuthorizationInfo()` 方法,分别处理认证和授权逻辑。 Realm 通过 MyBatis ...

    shiro-realm案例

    2. `doGetAuthorizationInfo`: 这个方法用于执行授权。Shiro在用户登录成功后,会调用此方法来获取用户的权限信息。你需要在这里实现从数据源加载用户角色和权限的逻辑。返回一个`AuthorizationInfo`对象,包含用户...

    Shiro_Demo 一个简单的Shiro验证框架实例

    Shiro的授权机制通过`hasPermission`或者`isPermitted` API来检查用户是否有执行特定操作的权限。在Realm中,我们需要实现`doGetAuthorizationInfo()`方法,从数据源获取用户的权限信息。在Shiro_Demo中,我们可以...

    shiro权限案例demo

    2. **创建Realm**: Realm 实现需要覆盖`doGetAuthenticationInfo()`和`doGetAuthorizationInfo()`方法。前者用于获取用户凭据,后者用于获取用户的角色和权限。 3. **处理登录**:当用户尝试登录时,Shiro的`...

    shiro最简单整合版本

    2. 创建 Realm:根据应用的数据源实现自定义 Realm 类,覆盖 doGetAuthenticationInfo 和 doGetAuthorizationInfo 方法,以获取用户认证和授权信息。 ```java public class MyRealm extends AuthorizingRealm { //...

    shiro所需的全部jar包

    - 创建自定义Realm:实现`AuthorizingRealm`接口,覆盖`doGetAuthenticationInfo`和`doGetAuthorizationInfo`方法,以提供用户认证和授权的具体逻辑。 - 配置过滤器:定义Shiro过滤器,并在Web配置中声明它们,例如`...

    注释最全,一步步详解 shiro-ssm登录认证权限授予验证案例.zip

    - **Authorization(授权)**:控制用户访问权限,确定用户能否执行特定的操作。 - **Session Management(会话管理)**:处理用户会话,如存储用户信息、会话超时等。 - **Cryptography(加密)**:提供安全的...

    SSH整合Shiro源码

    - 实现自定义Realm:继承`AuthorizingRealm`,并覆盖其`doGetAuthenticationInfo()`和`doGetAuthorizationInfo()`方法,以实现认证和授权逻辑。 5. **Struts2整合Shiro** - 配置Struts2拦截器:在struts.xml中...

    shiro-Demo01

    7. **测试**:创建测试用例,模拟不同的用户登录并访问受保护的资源,确保Shiro能正确执行认证和授权。 在"shiro-Demo01"这个项目中,你可能还会看到以下文件和目录: - `WebRoot/WEB-INF/web.xml`:Web应用的配置...

    springboot-shiro

    2. 实现Realm:重写`doGetAuthenticationInfo`和`doGetAuthorizationInfo`方法,完成用户身份验证和权限授权。 3. 编写Filter配置:在`WebSecurityConfig`中配置ShiroFilterFactoryBean,设置过滤器链,例如登录、...

    springboot+shiro入门案例

    2. **授权(Authorization)**:也称为访问控制,决定用户是否有权限执行特定的操作或访问特定资源。 3. **会话管理(Session Management)**:跟踪用户状态,通常在Web应用中,会话是用于保存用户信息的关键。 4. *...

    shirodemo整合spring+springmvc+shiro

    8. **测试与调试**:在项目运行后,尝试登录并访问受保护的资源,查看Shiro是否能正确执行认证和授权。通过日志输出或断点调试,找出可能出现的问题。 通过以上步骤,我们就完成了Shiro与Spring、SpringMVC的整合,...

    Spring框架中整合Shiro

    例如,我们创建一个自定义的UserRealm,继承自AuthorizingRealm,并实现doGetAuthenticationInfo和doGetAuthorizationInfo方法,以处理身份验证和授权逻辑: ```xml &lt;!-- 配置数据源 --&gt; ``` 然后,配置...

Global site tag (gtag.js) - Google Analytics