采用shiro实现登录认证(一)

应用的框架:spring,springMVC,maven,shiro

1.shiro的配置,通过maven加入shiro相关jar包

         <!-- shiro -->  
         <dependency>  
             <groupId>org.apache.shiro</groupId>  
             <artifactId>shiro-core</artifactId>  
             <version>1.4.0</version>  
         </dependency>  
         <dependency>  
             <groupId>org.apache.shiro</groupId>  
             <artifactId>shiro-web</artifactId>  
            <version>1.4.0</version>  
         </dependency>  
         <dependency>  
             <groupId>org.apache.shiro</groupId>  
             <artifactId>shiro-ehcache</artifactId>  
             <version>1.4.0</version>  
         </dependency>  
         <dependency>  
             <groupId>org.apache.shiro</groupId>  
             <artifactId>shiro-spring</artifactId>  
             <version>1.4.0</version>  
         </dependency>  

2.在web.xml中添加shiro过滤器

<!-- 配置shiro的核心拦截器 -->
<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>

3.在spring中添加shiro配置(applicationContext.xml,也可单独创建一个,但是要注意在web.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">

    <!-- 配置緩存管理器 -->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <!-- 指定 ehcache 的配置文件,下面会给到 -->
        <property name="cacheManagerConfigFile" value="classpath:spring/ehcache-shiro.xml"/>
    </bean>
    
    <!-- 会话管理器 -->
      <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
          <!-- session的失效时长,单位毫秒 -->
          <property name="globalSessionTimeout" value="600000" />
          <!-- 删除失效的session -->
          <property name="deleteInvalidSessions" value="true" />
          <property name="sessionDAO" ref="sessionDao" />
          <property name="sessionIdCookie" ref="simpleCookie"/>
          
     </bean>
     
     <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
    	<constructor-arg name="name" value="shiro.sesssion"/>
    		<property name="path" value="/"/>
 	 </bean>
     
     <!-- Shiro SessionId -->
     <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />
     
     <!-- Shiro SessionDao -->
    <bean id="sessionDao" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
       <property name="activeSessionsCacheName" value="shiro-activeSessionCache"></property>
        <property name="sessionIdGenerator" ref="sessionIdGenerator"></property>
        <property name="cacheManager" ref="cacheManager"></property>
    </bean>
     
     <!-- rememberMeManager管理器,写cookie,取出cookie生成用户信息 -->
     <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
         <property name="cookie" ref="rememberMeCookie" />
     </bean>
     <!-- 记住我cookie -->
     <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
         <!-- rememberMe是cookie的名字 -->
         <constructor-arg value="rememberMe" />
         <!-- 记住我cookie生效时间30天 -->
         <property name="maxAge" value="2592000" />
     </bean>


    <!-- 配置 Shiro 的 SecurityManager Bean.安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="myRealm"/>
        <!-- 注入缓存管理器 -->
        <property name="cacheManager" ref="cacheManager"/>
        <!-- 注入session管理器 -->
        <property name="sessionManager" ref="sessionManager" />
         <!-- 记住我 -->
        <property name="rememberMeManager" ref="rememberMeManager" />
        
    </bean>
    
    <!-- 配置进行授权和认证的 Realm,要新增一个java类来实现,下面会有,class=包名.类名,init-methood是初始化的方法 -->
    <bean id="myRealm" class="com.weixin.shiro.MyRealm" init-method="setCredentialMatcher">
    	<!-- 将凭证匹配器设置到realm中,realm按照凭证匹配器的要求进行散列 -->
    	<!-- <property name="credentialsMatcher" ref="credentialsMatcher" /> -->
    </bean>
    
    
      <!-- 凭证匹配器 与上述初始化方法作用相同 -->
      <!-- <bean id="credentialsMatcher"
          class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                                  选用MD5散列算法
          <property name="hashAlgorithmName" value="md5" />
                                  进行一次加密
          <property name="hashIterations" value="1" />
      </bean> -->
      
    <!-- 配置 Bean 后置处理器: 会自动的调用和 Spring 整合后各个组件的生命周期方法. -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    
    
    <bean id="systemLogoutFilter" class="com.weixin.shiro.SystemLogoutFilter"/>

    <!-- 配置 ShiroFilter bean: 该 bean 的 id 必须和 web.xml 文件中配置的 shiro filter 的 name 一致  -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 装配 securityManager -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 配置登陆页面 -->
        <property name="loginUrl" value="/layuiback/start/index.html"/>
        <!-- 登陆成功后的页面 -->
        <property name="successUrl" value="/layuiback/start/login.html"/>
        <!-- 通过unauthorizedUrl指定没有权限操作时跳转页面 -->
        <property name="unauthorizedUrl" value="/layuiback/start/login.html"/>
        
        <!-- 自定义filter,可用来更改默认的表单名称配置 -->
        <property name="filters">
              <map>
                 <!--退出过滤器-->
                <entry key="logout" value-ref="systemLogoutFilter" />
              </map>
         </property>
        
        <!-- 具体配置需要拦截哪些 URL, 以及访问对应的 URL 时使用 Shiro 的什么 Filter 进行拦截.  -->
        <property name="filterChainDefinitions">
            <value>
            	  <!--  对静态资源设置匿名访问 -->
            	  /layuiback/start/** = anon 
                  /layuiback/front/** = anon
                  /layuiback/src/** = anon
                  <!-- 登陆接口和验证码 -->
                  /layuiback/admin/getCode = anon
                  /layuiback/admin/login = anon
                  <!-- 请求 logout地址,shiro去清除session -->
                  /layuiback/admin/logout = logout
                 <!--  所有url都必须认证通过才可以访问 -->
                  /**=authc
                  
             
            </value>
        </property>
    </bean>

</beans>

4.实现shiro的登陆与退出

/**
     * 管理员登录
     * @param username
     * @param password
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public Object login(HttpSession session,String username, String password,String vercode){

        Map<String,Object> map = new HashMap<String,Object>();
        /*String code = (String)session.getAttribute("seCode");
        if(vercode!= null && !vercode.equals(code)){
            map.put("code",2);
            map.put("msg","验证码错误!");
            return JSONObject.toJSON(map);
        }
        */
        UsernamePasswordToken token = null;
        try {
       	       Subject subject = SecurityUtils.getSubject();
               token = new UsernamePasswordToken(username, password);
               token.setRememberMe(true);
	           	 //执行认证操作. 
               subject.login(token);
               
               map.put("code",0);
               map.put("msg","登录成功!");
               map.put("access_token",token.getPrincipal());
        	} catch (UnknownAccountException uae) { 
        		map.put("code",1);
                map.put("msg","没有该用户!");
    		   logger.info("没有该用户: " + token.getPrincipal()); 
    		} catch (IncorrectCredentialsException ice) { 
    			map.put("code",1);
                map.put("msg","用户或密码不正确!");
    			logger.info( token.getPrincipal() + " 的密码不正确!\n"); 
			} catch (LockedAccountException lae) { 
				map.put("code",1);
                map.put("msg",token.getPrincipal() + " 被锁定 ,请联系管理员!");
				logger.info( token.getPrincipal() + " 被锁定 ,请联系管理员!\n");
			}catch (AuthenticationException ae) { 
				//其他未知的异常 
				map.put("code",1);
                map.put("msg",token.getPrincipal()+"登陆异常!");
				logger.debug(token.getPrincipal()+"登陆异常!");
			}
        
            return JSONObject.toJSON(map);
    }
    
    /**
     * 管理员退出
     */
    @ResponseBody
    @RequestMapping(value = "/logout",method = RequestMethod.GET)
    public Object  logout(){
    	Map<String,Object> map = new HashMap<String,Object>();
    	Subject subject = SecurityUtils.getSubject();
        	 //执行认证操作. 
        subject.logout();
    	map.put("code",1001);
    	map.put("msg", "退出成功!");
    	return JSONObject.toJSON(map);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值