• shiro安全框架


    1.SsSM框架整合shiro(基于ssm框架环境无误的情况下)

      1.1.导入约束

    <properties> <shiro.version>1.2.3</shiro.version> </properties> <!-- shiro --> <!-- shiro核心包 --> <!-- 添加shiro web支持 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>${shiro.version}</version> </dependency> <!-- 添加shiro spring整合 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${shiro.version}</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.2.3</version> </dependency>

      1.2.在web.xml中配置过滤器

     <!-- shiro框架过滤器-->
        <filter>
            <filter-name>delegatingFilterProxy</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>delegatingFilterProxy</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

       1.3.配置spring的配置文件applicationContext.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"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://www.springframework.org/schema/context   
                     http://www.springframework.org/schema/context/spring-context.xsd
                         http://www.springframework.org/schema/aop
                             http://www.springframework.org/schema/aop/spring-aop.xsd 
                              http://www.springframework.org/schema/tx
                                   http://www.springframework.org/schema/tx/spring-tx.xsd">
        
     <!-- 第一步配置ShiroFilterFactoryBean-->
        <!-- 要求id跟web.xml配置的过滤器id一样-->
        <bean id="delegatingFilterProxy" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <!--登录页面-->
            <property name="loginUrl" value="/login.jsp"></property>
            <!--登录成功页面-->
            <property name="successUrl" value="/succes.jsp"></property>
            <!--无权限页面-->
            <property name="unauthorizedUrl" value="unauthorized.jsp"></property>
            <!--安全管理器-->
            <property name="securityManager" ref="SecurityManager"></property>
            <!-- 那些路径的访问权限-->
            <property name="filterChainDefinitions">
                <value>
                    <!-- 按顺序赋予-->
                    /login.jsp=anon <!-- anon无需认证-->
                    /login/login=anon
                    /chearuser=logout<!-- logout清除缓存-->
                    /admin.jsp=roles[admin]<!-- 需要admin这个权限-->
                    /user.jsp=roles[user]
                    /**=authc<!-- 需要登录-->
                </value>
            </property>
            <!--<property name="filterChainDefinitionMap" ref="map">-->
            <!--</property>-->
        </bean>
    
     
    <!-- 安全管理器-->
        <bean id="SecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <!--<property name="authenticator" ref="ModularRealmAuthenticatorr"/>-->
            <!-- 需要自定义一个Realm-->
            <property name="realm" ref="MyRealm"></property>
        </bean>
    
    
     <!--自定义一个Realm -->
        <bean id="MyRealm" class="cwd.Shiro.MyRealm">
            <!-- 加密证书匹配器-->
            <property name="credentialsMatcher">
                <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                    <!-- 加密方法-->
                    <property name="hashAlgorithmName" value="MD5"></property>
                    <!-- 加密迭代的次数-->
                    <property name="hashIterations" value="10"></property>
                </bean>
            </property>
        </bean>
       
    
    </beans>

       1.4.自定义一个Realm类  

    package cwd.Shiro;
    import cwd.Pojo.PersonalPojo;
    import cwd.Service.PersonalService;
    import org.apache.shiro.authc.*;
    import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.crypto.hash.SimpleHash;
    import org.apache.shiro.realm.AuthenticatingRealm;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.util.ByteSource;
    import org.springframework.beans.factory.annotation.Autowired;
    import java.util.HashSet;
    import java.util.Set;
    
    public class MyRealm extends AuthorizingRealm {
        @Autowired
        private PersonalService service;
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            //强转取得控制层传过来的UsernamePasswordToken
            UsernamePasswordToken token= (UsernamePasswordToken) authenticationToken;
            //获取账号
            String zhanghao= token.getUsername();
            //获取realmname
            String realmname=getName();
            //加密的盐值
            ByteSource salt=ByteSource.Util.bytes(zhanghao);
            //根据账号去数据库查询
            PersonalPojo personal=service.findbyzhanghao(zhanghao);
            if (personal==null){
               throw new UnknownAccountException();
            }
            // 返回
            SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(zhanghao,personal.getMima(),salt,realmname);
            return simpleAuthenticationInfo;
    
        }
    
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            //获取账号
            String  zhanghao= (String) principalCollection.getPrimaryPrincipal();
            PersonalPojo personal=service.findbyzhanghao(zhanghao);
            Set<String> roles=new HashSet<>();
            roles.add(personal.getQuanxian());
            if ("admin".equals(personal.getQuanxian())){
                roles.add("user");
            }
            //设置权限
            SimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo(roles);
            return simpleAuthorizationInfo;
        }
    }

       1.5.Controller处理登录

    package cwd.Controller;
    
    import cwd.Pojo.PersonalPojo;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.subject.Subject;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/login")
    public class LoginController {
        @RequestMapping("/login")
        public String login(PersonalPojo pojo) {
            //获取subject对象
            Subject subject= SecurityUtils.getSubject();
            if (!subject.isAuthenticated()){
                //封装一个UsernamePasswordToken对象
                UsernamePasswordToken token=new UsernamePasswordToken(pojo.getZhanghao(),pojo.getMima());
                //记住密码
                token.setRememberMe(true);
                //登录方法
                    subject.login(token);
            }
            return "redirect:/succes.jsp";
        }
    }

    1.2加密

    1.2.1在备注配置realm的bean的时候,添加加密方法

     <!--自定义一个Realm -->
        <bean id="MyRealm" class="cwd.Shiro.MyRealm">
            <!-- 加密证书匹配器-->
            <property name="credentialsMatcher">
                <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                    <!-- 加密方法-->
                    <property name="hashAlgorithmName" value="MD5"></property>
                    <!-- 加密迭代的次数-->
                    <property name="hashIterations" value="10"></property>
                </bean>
            </property>
        </bean>

    1.2.2获取某数字的md5序列

     public static void main(String[] args) {
            //获取 123  MD5的 迭代10次的数列
           Object object=new SimpleHash("MD5","123",null,10);
            System.out.println(object);
        }

     1.2.3盐值加密,达到即使两个密码相同,序列也不一样

          String realmname=getName();
            //加密的盐值
            ByteSource salt=ByteSource.Util.bytes(zhanghao);
            //根据账号去数据库查询
            PersonalPojo personal=service.findbyzhanghao(zhanghao);
            if (personal==null){
               throw new UnknownAccountException();
            }
            // 返回
            SimpleAuthenticationInfo simpleAuthenticationInfo=new SimpleAuthenticationInfo(zhanghao,personal.getMima(),salt,realmname);

     1.3多realms验证

    1.3.1配置多个reamls  bean 一个是md5加密 一个是sha1加密

     <bean id="MyRealm" class="cwd.Shiro.MyRealm">
            <!-- 加密证书匹配器-->
            <property name="credentialsMatcher">
                <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                    <!-- 加密方法-->
                    <property name="hashAlgorithmName" value="MD5"></property>
                    <!-- 加密迭代的次数-->
                    <property name="hashIterations" value="10"></property>
                </bean>
            </property>
        </bean>
        <bean id="MeRealm" class="cwd.Shiro.MeRealm">
            <!-- 加密-->
            <property name="credentialsMatcher">
                <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                    <property name="hashAlgorithmName" value="SHA1"></property>
                    <property name="hashIterations" value="10"></property>
                </bean>
            </property>
        </bean>

     1.3.2配置认证器

     <!-- 认证器-->
        <bean id="ModularRealmAuthenticatorr" class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
            <property name="realms">
                <list>
                    <ref bean="MyRealm"></ref>
                    <ref bean="MeRealm"></ref>
                </list>
            </property>
            <!-- 开启认证策略,都符合才通过,默认是一个通过就可以-->
            <property name="authenticationStrategy">
                <bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"></bean>
            </property>
        </bean>

     1.3.3注册认证器

     <!-- 安全管理器-->
        <bean id="SecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
       
           <!--注册认证器 -->
            <property name="authenticator" ref="ModularRealmAuthenticatorr"></property>
        </bean>
    <!-- 安全管理器-->
    <bean id="SecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <!--<property name="authenticator" ref="ModularRealmAuthenticatorr"/>-->
    <!-- 需要自定义一个Realm-->
    <property name="realm" ref="MyRealm"></property>
    <property name="authenticator" ref="ModularRealmAuthenticatorr"></property>
    </bean>
  • 相关阅读:
    15、Go语言基础之并发
    14、Go语言基础之反射
    13、Go语言基础之接口
    12、Go语言基础之包
    Golang ECHO中间件【10】
    Golang ECHO文件上传【9】
    关于数据治理的收获
    Java内存模型(JMM)和虚拟机(JVM)内存、GC
    图的m着色问题
    矩阵链乘法
  • 原文地址:https://www.cnblogs.com/miwujun/p/13380373.html
Copyright © 2020-2023  润新知