StringMVC+Shiro 权限控制

使用Shiro 进行权限控制 实现过程记录

在网上找了一些教程 开始搭建 Shiro 环境,本文 非教程类文档。如有不正确的地方及时提醒。


Controller 中配置 Shiro 控制 

/**
 * Shiro 案例 RequiresRoles
 *
 * 基于角色 标识的权限控制案例
 */
@RequestMapping(value = "/admin")
@ResponseBody
@RequiresRoles(value = RoleSign.ADMIN)
public String admin() {
    return "拥有admin角色,能访问";
}

/**
 * Shiro 案例 RequiresPermissions
 *
 * 基于权限标识的权限控制案例
 */
@RequestMapping(value = "/create")
@ResponseBody
@RequiresPermissions(value = PermissionSign.USER_CREATE)
public String create() {
    return "拥有user:create权限,能访问";
}

// PermissionSign.USER_CREATE = user:create

@RequiresPermissions 在用户没有拥有该权限(user:create )时会抛出异常。

无敌烦前台 提示异常信息,客户会感觉这是个BUG,low 。

异常处理 

1.常用办法:使用Shiro 的 "unauthorizedUrl" 进行提示。

2.我自己的办法:前端使用 DWZ ,我选择了一种比较符合DWZ 风格的办法。SpringMVC 捕获异常并使用DWZ 的消息回调函数进行提示。

//Shiro 未授权 异常处理
@ExceptionHandler(UnauthorizedException.class)
public ModelAndView exception401(UnauthorizedException e, HttpServletRequest request) {

    request.setAttribute("exception", "用户角色未授权使用该功能!");

    return ajaxDoneError("用户角色未授权使用该功能!");
}

单一用户在线控制

参考:http://jinnianshilongnian.iteye.com/blog/2039760

 


错误集合

遇到的第一个问题:log 中提示下面内容

No cache or cacheManager properties have been set.  Authorization cache cannot be obtained.

解决方案

因为没有加入缓存 才提示该错误,使用  Ehcache,添加

<property name="cacheManager" ref="shiroEhcacheManager" />

参考 http://blog.csdn.net/a35038438/article/details/51316288 


附 配置 applicationContext-shiro.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">

    <description>apache shiro配置</description>

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="/rest/page/login"/>
        <property name="successUrl" value="/rest/index"/>
        <property name="unauthorizedUrl" value="/rest/page/401"/>
        <property name="filterChainDefinitions">
            <value>
                <!-- 静态资源允许访问 -->
                /js/** = anon
                /styles/** = anon
               
            </value>
        </property>
    </bean>

    <!-- 缓存管理器 使用Ehcache实现 -->
    <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
    </bean>

    <!-- 会话DAO -->
    <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"/>

    <!-- 会话管理器 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <property name="sessionDAO" ref="sessionDAO"/>
    </bean>

    <!-- 安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realms">
            <list>
                <ref bean="securityRealm"/>
            </list>
        </property>

        <!-- cacheManager,集合spring缓存工厂 -->
        <property name="cacheManager" ref="shiroEhcacheManager" />
        <property name="sessionManager" ref="sessionManager" />
    </bean>

    <!-- Shiro生命周期处理器 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

</beans>

 

 

 

转载于:https://my.oschina.net/u/853529/blog/710990

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值