zoukankan      html  css  js  c++  java
  • 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. }  
     最后启动服务登录,实验证明,失败返回登录页,成功进入主页。
  • 相关阅读:
    提交代码报错不同方式
    pow log 与 (int)
    优先队列的创建
    积性函数
    静态主席树,动态主席树(一种可持久化线段树)
    codeblocks 输入、输出文件的位置
    后缀自动机
    BellmanFord 最短路
    struct
    hdu1501 动态规划
  • 原文地址:https://www.cnblogs.com/understander/p/5888125.html
Copyright © 2011-2022 走看看