文档章节

spring整合shiro

金馆长1
 金馆长1
发布于 2015/08/21 17:14
字数 842
阅读 448
收藏 21
web.xml:
<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


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"
    default-lazy-init="true">
    <description>Shiro安全配置</description>
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    
        <!-- 数据库认证的实现 -->
        <property name="realm" ref="shiroAuthRealm" />
        
        <!-- Session管理器 -->
        <property name="sessionManager" ref="sessionManager" />
        
        <!-- 缓存管理器 -->
        <property name="cacheManager" ref="shiroCacheManager" />
        
    </bean>
    
    <!-- Session管理器 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
    
        <!-- 超时时间 -->
        <property name="globalSessionTimeout" value="1800000" />
        
        <!-- Session存储的实现 -->
        <property name="sessionDAO" ref="shiroSessionDao" />
        
        <!-- SessionIdCookie的实现 -->
        <property name="sessionIdCookie" ref="sharesession" />
        
        <!-- 定时检查失效的Session -->
        <property name="sessionValidationSchedulerEnabled" value="true" />
    </bean>
         <!-- SessionIdCookie的实现 -->
    <bean id="sharesession" class="org.apache.shiro.web.servlet.SimpleCookie">        
        <constructor-arg name="name" value="SHAREJSESSIONID" />        
        <property name="path" value="/" />        
    </bean>
    
    
    <!-- Session存储的实现 -->
    <bean id="shiroSessionDao" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO" />
        
    <!-- 单机Session -->
    <bean id="shiroCacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" />
    
    
    <!-- 数据库认证的实现 -->
    <bean id="shiroAuthRealm" class="web.service.ShiroAuthRealm">
        <!-- 注入 shiroAuthService -->
        <property name="shiroAuthService" ref="shiroAuthService" />        
    </bean>
    <!-- ShiroFilter -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/login" />
        <property name="successUrl" value="/login/main.do" />
        <!-- Shiro连接约束配置,即过滤链的定义 -->  
        <!-- 此处可配合我的这篇文章来理解各个过滤连的作用http://blog.csdn.net/jadyer/article/details/12172839 -->  
        <!-- 下面value值的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的 -->  
        <!-- anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种 -->  
        <!-- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter -->  
 
 
        <property name="filterChainDefinitions">
            <value>            
                /commons/css/** = anon
                /commons/images/** = anon
                /commons/js/** = anon                        
                /regist/** = anon
                /login = authc
                /logout = logout                
                /** = user
            </value>
        </property>
    </bean>
    <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->  
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
    
    <bean id="formAuthenticationFilter"   class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"/>
</beans>



自定义的Realm类:


public class ShiroAuthRealm extends AuthorizingRealm {
     /** 
     * 为当前登录的Subject授予角色和权限 
     * @see  经测试:本例中该方法的调用时机为需授权资源被访问时 
     * @see  经测试:并且每次访问需授权资源时都会执行该方法中的逻辑,这表明本例中默认并未启用AuthorizationCache 
     * @see   个人感觉若使用了Spring3.1开始提供的ConcurrentMapCache支持,则可灵活决定是否启用AuthorizationCache 
     * @see  比如说这里从数据库获取权限信息时,先去访问Spring3.1提供的缓存,而不使用Shior提供的AuthorizationCache 
     */  

    private ShiroAuthService shiroAuthService;
    public ShiroAuthService getShiroAuthService() {
        return shiroAuthService;
    }
    public void setShiroAuthService(ShiroAuthService shiroAuthService) {
        this.shiroAuthService = shiroAuthService;
    }
    /**
     * 
     * 认证回调函数,登录时调用.
     * 
     */
//此处是写死的认证,实际中需要将两个admin替换成从数据库中查询的admin
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken authcToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
        String userName = token.getUsername();
        String password = String.valueOf(token.getPassword());
        if (userName.equals("admin") && password.equals("admin")) {
            return new SimpleAuthenticationInfo(new ShiroUser("1", userName,
                    "cuijianbo"), password, "cuijianbo");
        } else {
            return null;
        }
    }
    /**
     * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal();
        String username = shiroUser.getLoginName();
        if (username != null) {
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            info.addStringPermission("add");
            info.addStringPermission("del");
            info.addStringPermission("edit");
            info.addStringPermission("view");
            return info;
        }
        return null;
    }
    /**
     * 
     * 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息
     * 
     */
    public class ShiroUser implements Serializable {
        private static final long serialVersionUID = -1373760761780840081L;
        public String userid;
        public String loginName;
        public String name;
        public ShiroUser(String userid, String loginName, String name) {
            this.userid = userid;
            this.loginName = loginName;
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getUserid() {
            return userid;
        }
        public void setUserid(String userid) {
            this.userid = userid;
        }
        public String getLoginName() {
            return loginName;
        }
        public void setLoginName(String loginName) {
            this.loginName = loginName;
        }
    }
}  



© 著作权归作者所有

共有 人打赏支持
金馆长1
粉丝 17
博文 43
码字总数 29363
作品 0
海淀
程序员
加载中

评论(4)

金馆长1
金馆长1

引用来自“半心丶守”的评论

很不错 嘿嘿
非常感谢~么么哒~
半心丶守
很不错 嘿嘿
金馆长1
金馆长1

引用来自“你个大胖子”的评论

一直想学shiro,感谢提供了很棒的demo

谢谢13一起学习
你是红薯派来的逗逼吗
你是红薯派来的逗逼吗
一直想学shiro,感谢提供了很棒的demo
maven子模块适合使用spring boot吗?

单模块的情况下,Spring Boot的配置非常简单。但在maven多模块中,Spring Boot真的很不友好。 第一,Application的注解需要显式添加 @ComponentScan("XXX.XXX.XXX") 否则,入口模块以外的模块...

itwriter
08/08
0
0
SpringBoot整合Shiro使用Ehcache等缓存无效问题

前言 整合有缓存、事务的spring boot项目一切正常。 在该项目上整合shiro安全框架,发现部分类的缓存Cache不能正常使用。 然后发现该类的注解基本失效,包括事务Transaction注解。事务不能正...

巅峰小学生
05/18
0
0
整合 SpringMVC 3.2.5 和 Shiro 1.2.3

按着《SpringMVC整合Shiro》这篇博文来做即可。但是,在启动时发现Spring的配置被载入两次,很明显SpringMVC 和 Shiro 所使用的不是同一个 Spring Application Context。在参考《ContextLoad...

xray2100
2014/03/14
0
1
SpringMvc + Shiro[数据库存权限] 配置 ;[附git.oschina的项目地址]

一 shiro简介 apache shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证明“你是谁?” We...

王庭
2015/10/28
0
3
Archx/spring-agg

#SPRING-AGG 这个一个框架整合案列,包含 SpringMVC/MyBatis/Apache Shiro 。 演示数据 演示数据请导入 db.sql 演示账号密码均为 SpringMVC 配置 演示项目使用的是 RESTful 风格,不是传统的...

Archx
2015/01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【mpvue】三

使用了快1个月,陆续整理发现的坑 1、pageA-pageB-pageA-pageC 如果以这种顺序,大概理解成,列表进详情B, 返回列表进入详情C,那么进入详情C的时候,会因为缓存,先展现详情B的内容。解决方...

登天的感觉
14分钟前
1
0
在EXCEL指定SHEET页,指定文字位置,插入批注

Java操作EXCEL文件,利用POI,在EXCEL指定SHEET页中指定文字位置处插入批注 package excel; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.hssf......

zhaochaochao
15分钟前
1
0
一些网站。

UI schema,可以用json定义UI表单:https://jsonforms.io/examples/array

王坤charlie
22分钟前
1
0
百万连接,百亿吞吐量服务的JVM性能调优实战

转载占小狼博客 应用:shark-新美大移动端网络优化(每日接受移动端请求约150亿) 应用特点 : qps比较高,新生代增长飞快 用户的连接需要维持一段时间 单机需要维持海量连接,几十万的级别 以...

BakerZhu
25分钟前
1
0
iOS涂色涂鸦效果、Swift仿喜马拉雅FM、抽屉转场动画、拖拽头像、标签选择器等源码

iOS精选源码 LeeTagView 标签选择控件 为您的用户显示界面添加美观的加载视图 Swift4: 可拖动头像,增加物理属性 Swift版抽屉效果,自定义转场动画管理器 Swift 仿写喜马拉雅FM 可能是最好用...

sunnyaigd
25分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部