• 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. }  
     最后启动服务登录,实验证明,失败返回登录页,成功进入主页。
  • 相关阅读:
    XML(学习笔记)
    css样式学习笔记
    Request(对象)
    sql一些错误修改的总结
    转载(如何学习C#)
    sql server(学习笔记2 W3Cschool)
    sql sqrver(学习笔记1 W3Cschool)
    关于 flutter开发碰到的各种问题,有的已经解决有的一直没解决或者用其他方法替代
    关于 Flutter IOS build It appears that your application still contains the default signing identifier.
    关于 flutter本地化问题 The getter 'pasteButtonLabel' was called on null
  • 原文地址:https://www.cnblogs.com/understander/p/5888125.html
Copyright © 2020-2023  润新知