spring 통합 shiro

8663 단어 shiro
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  
Spring 3.1 부터 제공 되 는 Concurrent MapCache 지원 을 사용 하면 AuthorizationCache 사용 여 부 를 유연 하 게 결정 할 수 있 을 것 같 습 니 다. 
     * @see  예 를 들 어 데이터베이스 에서 권한 정 보 를 가 져 올 때 Shior 가 제공 하 는 AuthorizationCache 대신 Spring 3.1 에서 제공 하 는 캐 시 를 방문 합 니 다. 
     */  
    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;
        }
    }
}

좋은 웹페이지 즐겨찾기