文档章节

spring整合shiro

金馆长1
 金馆长1
发布于 2015/08/21 17:14
字数 842
阅读 450
收藏 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;
        }
    }
}  



© 著作权归作者所有

共有 人打赏支持
上一篇: git (一)
下一篇: shiro个人学习1
金馆长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
使用 Smart Security 实现安全控制

很多朋友都问过我同样一个问题:“Smart 目前有身份认证与权限管理等安全控制功能吗?” 当听到这样的问题时,我真的非常不好意思,实在是没有这方面的特性。不过当我学习了 Shiro 以后,让我...

黄勇
2014/03/31
0
11

没有更多内容

加载失败,请刷新页面

加载更多

get和post详解

get和post是表单提交的两种方式,get请求数据通过域名后缀URL传送,用户可见,不安全,post请求数据通过在请求报文正文里传输,相对比较安全。get是通过URL传递表单值,post通过URL看不到表单...

青衣霓裳
16分钟前
0
0
linux-如何快速替换IP

在Linux在做高可用的时候,经常会使用到虚拟IP。在windows上一个网卡可以配置两个IP,在Linux直接使用ip命令就可以添加了。 添加 ip address add 192.168.1.200/24 broadcast 192.168.1.255 ...

Linux就该这么学
21分钟前
0
0
Unix-Linux 编程实践教程 第五章 小结

设备文件中用逗号连接起来的两个数字为主设备号和从设备号。主设备号确定实际的设备驱动程序,从设备号作为参数。 如下图中的,主设备号-4,从设备号-2 设备文件中的i-node存储的是指向内核子...

Explorer0
23分钟前
0
0
virtual box centos7 挂载进行文件和共享使用说明

一、virtualbox共享文件夹无访问权限问题解决方法 (转载 http://www.cnblogs.com/zhuguanhao/p/6192777.html) 这篇文章主要介绍了virtualbox共享文件夹无访问权限问题解决方法,造成这个问题...

mbzhong
25分钟前
0
0
Rabbitmq---消息队列

一 . MQ:message queue   消息队列的作用:   1 通信解耦   2 高峰限流 原理分析: 一开始,认证系统是强耦合的,A系统传递认证系统消息接收计算结果的过程中   1 传给认证系统   2 认...

Ala6
30分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部