spring整合shiro
spring整合shiro
金馆长1 发表于2年前
spring整合shiro
  • 发表于 2年前
  • 阅读 444
  • 收藏 21
  • 点赞 0
  • 评论 4

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 自己的demo 如有不好的地方指正一下 哈哈
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;
        }
    }
}  



标签: shiro
共有 人打赏支持
粉丝 17
博文 40
码字总数 29363
评论 (4)
你是红薯派来的逗逼吗
一直想学shiro,感谢提供了很棒的demo
金馆长1

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

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

谢谢13一起学习
半心丶守
很不错 嘿嘿
金馆长1

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

很不错 嘿嘿
非常感谢~么么哒~
×
金馆长1
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: