shiro入門(1)



博客分類:  shiro

一、 介紹:

shiro是apache提供的強大而靈活的開源安全框架,它主要用來處理身份認證,授權,企業會話管理和加密。

shiro功能:用戶驗證、用戶執行訪問權限控制、在任何環境下使用session API,如cs程序。可以使用多數據源如同時使用oracle、mysql。單點登錄(sso)支持。remember me服務。詳細介紹還請看官網的使用手冊:http://shiro.apache.org/reference.html

與spring security區別,個人覺得二者的主要區別是:

1、shiro靈活性強,易學易擴展。同時,不僅可以在web中使用,可以工作在任務環境內中。

2、acegi靈活性較差,比較難懂,同時與spring整合性好。

如果對權限要求比較高的項目,個人建議使用shiro,主要原因是可以很容易按業務需求進行擴展。

附件是對與shiro集成的jar整合及源碼。

二、shiro與spring集成

      shiro默認的配置,主要是加載ini文件進行初始化工作,具體配置,還請看官網的使用手冊(http://shiro.apache.org/web.html)init文件不支持與spring的集成。此處主要是如何與spring及springmvc集成。

    1、web.xml中配置shiro過濾器,web.xml中的配置類使用了spring的過濾代理類來完成。

Xml代碼  收藏代碼
  1. <filter>  
  2.    <filter-name>shiroFilter</filter-name>  
  3.     <filter-class>  
  4.         org.springframework.web.filter.DelegatingFilterProxy  
  5.     </filter-class>         
  6. </filter>  
  7. <filter-mapping>  
  8.     <filter-name>shiroFilter</filter-name>  
  9.     <url-pattern>/*</url-pattern  
  10. </filter-mapping>  
    2、在spring中的application.xml文件中添加shiro配置:
Xml代碼  收藏代碼
  1. <!--securityManager是shiro的核心,初始化時協調各個模塊運行-->  
  2. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  3.    <!--單個realm使用realm,如果有多個realm,使用realms屬性代替-->   
  4.    <property name="realm" ref="leopardRealm" />  
  5.    <property name="cacheManager" ref="shiroEhcacheManager" />  
  6. </bean>  
  7.     <!--realm配置,realm是shiro的橋樑,它主要是用來判斷subject是否可以登錄及權限等-->  
  8.     <bean id="leopardRealm" class="com.leopard.shiro.realm.LeopardRealm" />  
  9.     <!--shiro過濾器配置,bean的id值須與web中的filter-name的值相同-->  
  10.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  11.     <property name="securityManager" ref="securityManager" />  
  12.          <!-- 沒有權限或者失敗後跳轉的頁面 -->  
  13.      <property name="loginUrl" value="/login/login.jsp" />   
  14.      <property name="successUrl" value="/main/index.jsp" />  
  15.      <property name="unauthorizedUrl" value="/login/unauthorized" />  
  16.         <property name="filterChainDefinitions">  
  17.             <value>  
  18.                 /login/logoutlogout=logout  
  19.                 /login/**=anon  
  20.                 /**=authc,rest  
  21.             </value>  
  22.         </property>  
  23.     </bean>  
  24.     <!-- 用戶授權/認證信息Cache, 採用EhCache 緩存 -->  
  25.     <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
  26.         <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>  
  27.     </bean>  
 配置說明:
  •  securityManager是shiro的核心,初始化時協調各個模塊運行。
  • realm是shiro的橋樑,進行數據源配置,shrio提供了常用的realm數據源配置,如LDAP的JndiLdapRealm,JDBC的JdbcRealm,ini文件的IniRealm,properties文件的PropertiesRealm等,也可以插入自己的 Realm實現來代表自定義的數據源。此處使用了自定義的leopardRealm進行配置,java代碼如下:
    Java代碼  收藏代碼
    1. public class LeopardRealm extends AuthorizingRealm {  
    2.     /** 
    3.      * 授權方法,在配有緩存的情況下,只加載一次。 
    4.      */  
    5.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
    6.         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  
    7.                  //獲取用戶信息的所有資料,如權限角色等.  
    8.                  //info.setStringPermissions(權限集合);  
    9.         //info.setRoles(角色集合);  
    10.         return info;  
    11.     }  
    12.     /** 
    13.      * 登陸認證 
    14.      */  
    15.     @Override  
    16.     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)  
    17.                throws AuthenticationException {  
    18.         UsernamePasswordToken usernamePasswordToke = (UsernamePasswordToken)token;  
    19.         String username = usernamePasswordToke.getUsername();  
    20.         return new SimpleAuthenticationInfo(new ShiroUser("admin""admin"), "admin",  
    21.                         ByteSource.Util.bytes("admin"), getName());  
    22.           
    23.     }  
    24. }  
      簡單登錄操作:
      login.jsp代碼
Jsp代碼  收藏代碼
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <html>  
  3. <body>  
  4.     <form  action="${pageContext.request.contextPath}/login" method="post">  
  5.         用戶名:<input id="username" name="username" />  
  6.                 密碼:<input id="password" type="password" name="password" />  
  7.             記住我:<input type="checkbox" name="rememberMe" />  
  8.                 <input type="submit" name="submit" value="submit"/>  
  9.     </form>  
  10. </body>  
  11. </html>  
   springMVC控制層代碼:
Java代碼  收藏代碼
  1. import javax.servlet.http.HttpServletRequest;  
  2. import javax.servlet.http.HttpServletResponse;  
  3. import org.apache.shiro.SecurityUtils;  
  4. import org.apache.shiro.authc.AuthenticationException;  
  5. import org.apache.shiro.authc.IncorrectCredentialsException;  
  6. import org.apache.shiro.authc.UnknownAccountException;  
  7. import org.apache.shiro.authc.UsernamePasswordToken;  
  8. import org.apache.shiro.subject.Subject;  
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.servlet.ModelAndView;  
  12. @Controller("loginAction")  
  13. @RequestMapping("/login")  
  14. public class LoginAction  {  
  15.     @RequestMapping("")  
  16.        //登錄  
  17.     public ModelAndView execute(HttpServletRequest request,  
  18.             HttpServletResponse response,String username,String password) {  
  19.         UsernamePasswordToken token = new UsernamePasswordToken(username,password);  
  20.         //記錄該令牌  
  21.         token.setRememberMe(false);  
  22.         //subject權限對象  
  23.         Subject subject = SecurityUtils.getSubject();  
  24.         try {  
  25.             subject.login(token);  
  26.         } catch (UnknownAccountException ex) {//用戶名沒有找到  
  27.             ex.printStackTrace();  
  28.         } catch (IncorrectCredentialsException ex) {//用戶名密碼不匹配  
  29.             ex.printStackTrace();  
  30.         }catch (AuthenticationException e) {//其他的登錄錯誤  
  31.             e.printStackTrace();  
  32.         }  
  33.           
  34.         //驗證是否成功登錄的方法  
  35.         if (subject.isAuthenticated()) {  
  36.             return new ModelAndView("/main/index.jsp");  
  37.         }  
  38.         return new ModelAndView("/login/login.jsp");  
  39.     }  
  40.       
  41.         //退出  
  42.     @RequestMapping("/logout")  
  43.     public void logout() {  
  44.         Subject subject = SecurityUtils.getSubject();  
  45.         subject.logout();  
  46.     }  
  47. }  
 最後啓動服務登錄,實驗證明,失敗返回登錄頁,成功進入主頁。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章