javase和javaweb环境下shiro的搭建

shiro-1

javase环境下搭建shiro
         1.导入jar包
          2.配置文件:存储临时文件
                 shiro.ini文件:存储数据,用户名,密码,角色,权限
          3.代码
               // 1.获取安全管理器
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
		SecurityManager securityManager = factory.getInstance();
		// 2.设置安全管理器
		SecurityUtils.setSecurityManager(securityManager);
		// 3.获取subject对象,即要登录的对象
		Subject subject = SecurityUtils.getSubject();
spring与shiro集成
             1.导入jar包
              2.搭建好spring,springmvc
              3.搭建shiro环境
                    1.web.xml
                                     <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.在spring.xml中进行相关配置

shiro配置的核心:spring.xml欧中配置的一个bean<bean class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"></bean>

web.xml中DelegatingFilterProxy作用:入口,完成servlet容器到ioc容器的关联,到spring容器中找filter-name相同名字的bean实例
如果没有配置targetBeanName属性,则filter-name必须与bean的name相同

表单提交的数据封装到 usernamePasswordToken 数据库查询到的数据封装到SimpleAuthenticationInfo

加密:MD5, SHA1
1.存储数据时需要将用户输入的明文继续加密(Hibernate当中涉及md5加密)  (Ream.java)
                        //将存入数据库的密码进行MD5加密
			SimpleHash sh = new SimpleHash("md5", credentials, null, 2019);
2.前端用户输入的值,进行加密,string字符串经过md5加密(spring.xml)
                      <!-- 将前端的输入的密码进行md5的加密 -->
		      <property name="credentialsMatcher">
			  <bean
				class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
				<property name="hashAlgorithmName" value="md5"></property>
				<property name="hashIterations" value="2019"></property>
			  </bean>
		     </property>
盐值加密:原有加密的基础上加密(两个相同密码在数据库存储的值还是不一样)
        1.前端token当中获取的密码应该进行盐值加密
              ByteSource salt = ByteSource.Util.bytes(principal);
              new SimpleAuthenticationInfo(principal, sh, salt, realmName);
        2.数据库中的值进行盐值加密
               new SimpleHash("md5", credentials, salt, 2019);
多Realm获取数据:将一个密码存放在多个数据库中,建立多个Realm,并且每个realm使用不同的加密方式,在subject.login中会进行多个realm的调用,执行多次验证,提高数据安全性
         1.第一种方法:
            <!-- 多个realm -->
		<property name="realms">
			<list>
				<ref bean="jdbcRealm" />
				<ref bean="jdbcRealm1" />
			</list>
		</property>
           2.第二种方法:通过ModularRealmAuthenticator认证器

shiro认证策略:多个realm访问多个数据库,如何判断是否登录成功
  1.FirstSucessfulStrategy    第一个realm认证成功就算成功
  2.AtLeastOneSuccessfulStrategy 多个realm认证时,一个成功代表成功(默认)
  3.AllSuccessfulStrategy 多个realm认证时,全部成功才代表成功

授权:控制哪一个用户可以访问哪一个web资源
     1.编程式
         if(subect.hasRole){
                  //有权限
        }else{
                 //没有权限
         }
     2.注解式:通过在执行的java方法上注解
          @RequireRoles("admin")
          public void hello(){
             //有权限
          }
     3.jsp/gsp标签
    <shiro:hasRole name="admin">有权限</shiro:hasRole>
1.在FilterChainDefinitions中定义web资源对应角色
      web资源=roles[角色名称]
       /admin.jsp=roles[admin]
2.一个用户进行登录认证成功之后,之中还是要查找认证成功的角色拥有什么角色.realm可以和数据库交互,获取指定认证成功的用户对应的角色
        1.我们可以自定义一个Realm,继承AuthorizingRealm,认证和授权
        2.在ioc容器配置指定的Realm的bean实例(授权器)
        3.告知securityManager使用哪一个授权管理器

参考视频:点击我

posted @ 2019-03-25 20:17  Saruka的男朋友  阅读(347)  评论(2编辑  收藏  举报