• shiro框架的学习


    1shiro框架是什么:是一个权限控制的框架
    2shiro框架有什么作用:权限管理,管理那些资源是否需要登录才能访问、控制某些资源需要那些权限才能访问
    3shiro框架怎样使用:

              1在web.xml配置shiro的Filter,拦截指定的URL(注意只有被shiroFilter拦截到的URL才能被shiro管理)

      <!-- Shiro filter-->   
        <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> 

           2在shiro的配置文件里配置shiroFilter:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:cache="http://www.springframework.org/schema/cache"
        xmlns:task="http://www.springframework.org/schema/task"
        default-lazy-init="true"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
            http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
        <!-- shiro配置begin -->
        <!-- Shiro Filter -->
        <bean id="shiroFilter"
            class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <property name="securityManager" ref="securityManager" />
            <property name="loginUrl" value="/admin/login.jsp" />
            <property name="successUrl" value="/index.jsp" />
            <property name="unauthorizedUrl" value="/error.jsp" />
            <property name="filterChainDefinitions">
                <value>
                /admin/login.jsp = authc
                /admin/* = authc
                /validateCode = anon
                /* =anon
                </value>
            </property>
        </bean>
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <property name="realm" ref="shiroDbRealm" />
        </bean>
        <!-- 項目自定义的Realm -->
        <bean id="shiroDbRealm" class="com.framework.authority.realm.MyRealm" >
            <property name="authorizationCacheName" value="authorization" />
        </bean>
    
    
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager" />
            <property name="arguments" ref="securityManager" />
        </bean>
    
        
    </beans>

      3自定义Realm:
      

    package com.framework.authority.realm;
    
    import javax.security.auth.Subject;
    
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    
    public class MyRealm extends AuthorizingRealm  {
        public MyRealm() {
            super();    //To change body of overridden methods use File | Settings | File Templates.
        }
        //验证用户的准确性--验证登录
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
           //获取登录信息    
            System.out.println("-------------------验证用户的准确性-----------------------");
            UsernamePasswordToken userToken = (UsernamePasswordToken) authcToken;
            String userName=String.valueOf(userToken.getUsername());
            String password=String.copyValueOf(userToken.getPassword());
            System.out.println("用户名:---->"+userName);
            System.out.println("密码:-------------->"+password);
            userToken.setRememberMe(true);
            if(userName.equals("jeremy")&&password.equals("123")){
                //这个是什么来的???--验证登录信息对象
                SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(userName,password,getName());
                System.out.println("getName:-------------->"+getName());
                return info;
            }
            return null;
        }
        //为用户添加角色和权限---验证权限,
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            System.out.println("----------------验证用户的角色与权限--------------------");
            String userName=principals.asList().get(0).toString();
            if(userName.equals("jeremy")){
            SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
            info.addRole("youke");
            return info;
            }
            return null;
            
        }
    
    }

    4登录测试(登录提交的页面不用交给任何控制器处理,让shiroFilter来调用Realm来处理)

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
     <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
        <form action="login.jsp"  method="POST">
        userName:<input id="username" name="username"><br>
        password:<input id="password" name="password"><br>
        <input type="submit" id="submit" value="submit">
        </form>
    </body>
    </html>

    shiro框架的运行流程:
    request(url)---->shiroFilter是否是shiroURL--是-->FormAuthenticationFilter判断是当前URL的权限----没有权限-->longinURL--登录-->FormAuthenticationFilter(调用executeLogin()方法)---ModularRealmAuthenticator.doAuthenticate()---调用自定义的Realm---->doAuthenticationInfo()---->doAuthorizationInfo()--->????
    以上流程纯属个人猜测---》》

  • 相关阅读:
    VS中修改工程名的解决方案
    C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html
    OGR中空间叠加函数Union
    如何迅速掌握并提高linux运维技能(收藏文)
    Win10系统应用图标显示感叹号无法打开(详细版)
    IBM带库故障处理(驱动器down,磁带卡带,重配置)Netbackup
    2.2 Netbackup磁带库管理
    重复,空
    Oracle数据库几种启动方式及查询当前状态
    鸡汤自勉
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4437283.html
Copyright © 2020-2023  润新知