• shiro_02_身份认证加密


    目录

    一、盐加密

    1.明文密码 

     2.md5加密

    3.md5加盐加密 

    4.md5加盐加密加次数  1024

    5.演示代码

    二、shiro的认证 

    1.完成登录的方法 Mapper层的编写和biz层 

    2.自定义realm(重点)  

    3.Spring与shiro的整合(注意)

    4.测试


    一、盐加密

     数据库密码的发展史
        第一个阶段:明文密码    123456
        第二个阶段:md5加密    e10adc3949ba59abbe56e057f20f883e
        第三个阶段:md5加盐加密
        第四个阶段:md5加盐加密加次数         1024

    1.明文密码 

    也就是说在数据库里密码是可以看到的 

     

     2.md5加密

    数据库里的密码已经加密了 

    也就相当于密码是 e10adc3949ba59abbe56e057f20f883e=123456

    还可以看下面这张图也就是说这个加密还不够完全,它可以解出来,而且这个加密的密还是同一个,它始终不会变的e10adc3949ba59abbe56e057f20f883e 

    3.md5加盐加密 

    123456:原始密码
    盐:1
    e10adc3949ba59abbe56e057f20f883f
    盐:2
    e10adc3949ba59abbe56e057f20f883g 

    就是看你的盐加了多少然后就在继续加密

    4.md5加盐加密加次数  1024

     你要知道加了多少盐,还要知道多少次,也就是说别人加密多少次,你就要解密多少次

    5.演示代码

    1.导入pom依赖

    1. <!-- shiro相关依赖-->
    2. <dependency>
    3. <groupId>org.apache.shiro</groupId>
    4. <artifactId>shiro-core</artifactId>
    5. <version>1.3.2</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.apache.shiro</groupId>
    9. <artifactId>shiro-web</artifactId>
    10. <version>1.3.2</version>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.apache.shiro</groupId>
    14. <artifactId>shiro-spring</artifactId>
    15. <version>1.3.2</version>
    16. </dependency>

    所有的pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>org.examplegroupId>
    6. <artifactId>ssmartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <name>ssm Maven Webappname>
    10. <url>http://www.example.comurl>
    11. <properties>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <maven.compiler.source>1.8maven.compiler.source>
    14. <maven.compiler.target>1.8maven.compiler.target>
    15. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    16. <spring.version>5.0.2.RELEASEspring.version>
    17. <mybatis.version>3.4.5mybatis.version>
    18. <mysql.version>5.1.44mysql.version>
    19. <pagehelper.version>5.1.2pagehelper.version>
    20. <mybatis.spring.version>1.3.1mybatis.spring.version>
    21. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    22. <commons.pool2.version>2.4.3commons.pool2.version>
    23. <log4j2.version>2.9.1log4j2.version>
    24. <junit.version>4.12junit.version>
    25. <servlet.version>4.0.0servlet.version>
    26. <lombok.version>1.18.2lombok.version>
    27. properties>
    28. <dependencies>
    29. <dependency>
    30. <groupId>org.springframeworkgroupId>
    31. <artifactId>spring-contextartifactId>
    32. <version>${spring.version}version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.springframeworkgroupId>
    36. <artifactId>spring-ormartifactId>
    37. <version>${spring.version}version>
    38. dependency>
    39. <dependency>
    40. <groupId>org.springframeworkgroupId>
    41. <artifactId>spring-txartifactId>
    42. <version>${spring.version}version>
    43. dependency>
    44. <dependency>
    45. <groupId>org.springframeworkgroupId>
    46. <artifactId>spring-aspectsartifactId>
    47. <version>${spring.version}version>
    48. dependency>
    49. <dependency>
    50. <groupId>org.springframeworkgroupId>
    51. <artifactId>spring-webartifactId>
    52. <version>${spring.version}version>
    53. dependency>
    54. <dependency>
    55. <groupId>org.springframeworkgroupId>
    56. <artifactId>spring-testartifactId>
    57. <version>${spring.version}version>
    58. dependency>
    59. <dependency>
    60. <groupId>org.mybatisgroupId>
    61. <artifactId>mybatisartifactId>
    62. <version>${mybatis.version}version>
    63. dependency>
    64. <dependency>
    65. <groupId>mysqlgroupId>
    66. <artifactId>mysql-connector-javaartifactId>
    67. <version>${mysql.version}version>
    68. dependency>
    69. <dependency>
    70. <groupId>com.github.pagehelpergroupId>
    71. <artifactId>pagehelperartifactId>
    72. <version>${pagehelper.version}version>
    73. dependency>
    74. <dependency>
    75. <groupId>org.mybatisgroupId>
    76. <artifactId>mybatis-springartifactId>
    77. <version>${mybatis.spring.version}version>
    78. dependency>
    79. <dependency>
    80. <groupId>org.apache.commonsgroupId>
    81. <artifactId>commons-dbcp2artifactId>
    82. <version>${commons.dbcp2.version}version>
    83. dependency>
    84. <dependency>
    85. <groupId>org.apache.commonsgroupId>
    86. <artifactId>commons-pool2artifactId>
    87. <version>${commons.pool2.version}version>
    88. dependency>
    89. <dependency>
    90. <groupId>org.apache.logging.log4jgroupId>
    91. <artifactId>log4j-coreartifactId>
    92. <version>${log4j2.version}version>
    93. dependency>
    94. <dependency>
    95. <groupId>org.apache.logging.log4jgroupId>
    96. <artifactId>log4j-apiartifactId>
    97. <version>${log4j2.version}version>
    98. dependency>
    99. <dependency>
    100. <groupId>org.apache.logging.log4jgroupId>
    101. <artifactId>log4j-webartifactId>
    102. <version>${log4j2.version}version>
    103. dependency>
    104. <dependency>
    105. <groupId>junitgroupId>
    106. <artifactId>junitartifactId>
    107. <version>${junit.version}version>
    108. <scope>testscope>
    109. dependency>
    110. <dependency>
    111. <groupId>javax.servletgroupId>
    112. <artifactId>javax.servlet-apiartifactId>
    113. <version>${servlet.version}version>
    114. <scope>providedscope>
    115. dependency>
    116. <dependency>
    117. <groupId>org.projectlombokgroupId>
    118. <artifactId>lombokartifactId>
    119. <version>${lombok.version}version>
    120. <scope>providedscope>
    121. dependency>
    122. <dependency>
    123. <groupId>org.springframeworkgroupId>
    124. <artifactId>spring-webmvcartifactId>
    125. <version>${spring.version}version>
    126. dependency>
    127. <dependency>
    128. <groupId>javax.servlet.jspgroupId>
    129. <artifactId>javax.servlet.jsp-apiartifactId>
    130. <version>2.3.3version>
    131. dependency>
    132. <dependency>
    133. <groupId>jstlgroupId>
    134. <artifactId>jstlartifactId>
    135. <version>1.2version>
    136. dependency>
    137. <dependency>
    138. <groupId>taglibsgroupId>
    139. <artifactId>standardartifactId>
    140. <version>1.1.2version>
    141. dependency>
    142. <dependency>
    143. <groupId>commons-fileuploadgroupId>
    144. <artifactId>commons-fileuploadartifactId>
    145. <version>1.3.3version>
    146. dependency>
    147. <dependency>
    148. <groupId>org.hibernategroupId>
    149. <artifactId>hibernate-validatorartifactId>
    150. <version>6.0.7.Finalversion>
    151. dependency>
    152. <dependency>
    153. <groupId>com.fasterxml.jackson.coregroupId>
    154. <artifactId>jackson-databindartifactId>
    155. <version>2.9.3version>
    156. dependency>
    157. <dependency>
    158. <groupId>com.fasterxml.jackson.coregroupId>
    159. <artifactId>jackson-coreartifactId>
    160. <version>2.9.3version>
    161. dependency>
    162. <dependency>
    163. <groupId>com.fasterxml.jackson.coregroupId>
    164. <artifactId>jackson-annotationsartifactId>
    165. <version>2.9.3version>
    166. dependency>
    167. <dependency>
    168. <groupId>org.apache.shirogroupId>
    169. <artifactId>shiro-coreartifactId>
    170. <version>1.3.2version>
    171. dependency>
    172. <dependency>
    173. <groupId>org.apache.shirogroupId>
    174. <artifactId>shiro-webartifactId>
    175. <version>1.3.2version>
    176. dependency>
    177. <dependency>
    178. <groupId>org.apache.shirogroupId>
    179. <artifactId>shiro-springartifactId>
    180. <version>1.3.2version>
    181. dependency>
    182. dependencies>
    183. <build>
    184. <finalName>ssmfinalName>
    185. <resources>
    186. <resource>
    187. <directory>src/main/javadirectory>
    188. <includes>
    189. <include>**/*.xmlinclude>
    190. includes>
    191. resource>
    192. <resource>
    193. <directory>src/main/resourcesdirectory>
    194. <includes>
    195. <include>jdbc.propertiesinclude>
    196. <include>*.xmlinclude>
    197. includes>
    198. resource>
    199. resources>
    200. <pluginManagement>
    201. <plugins>
    202. <plugin>
    203. <groupId>org.apache.maven.pluginsgroupId>
    204. <artifactId>maven-compiler-pluginartifactId>
    205. <version>${maven.compiler.plugin.version}version>
    206. <configuration>
    207. <source>${maven.compiler.source}source>
    208. <target>${maven.compiler.target}target>
    209. <encoding>${project.build.sourceEncoding}encoding>
    210. configuration>
    211. plugin>
    212. <plugin>
    213. <groupId>org.mybatis.generatorgroupId>
    214. <artifactId>mybatis-generator-maven-pluginartifactId>
    215. <version>1.3.2version>
    216. <dependencies>
    217. <dependency>
    218. <groupId>mysqlgroupId>
    219. <artifactId>mysql-connector-javaartifactId>
    220. <version>${mysql.version}version>
    221. dependency>
    222. dependencies>
    223. <configuration>
    224. <overwrite>trueoverwrite>
    225. configuration>
    226. plugin>
    227. <plugin>
    228. <artifactId>maven-clean-pluginartifactId>
    229. <version>3.1.0version>
    230. plugin>
    231. <plugin>
    232. <artifactId>maven-resources-pluginartifactId>
    233. <version>3.0.2version>
    234. plugin>
    235. <plugin>
    236. <artifactId>maven-compiler-pluginartifactId>
    237. <version>3.8.0version>
    238. plugin>
    239. <plugin>
    240. <artifactId>maven-surefire-pluginartifactId>
    241. <version>2.22.1version>
    242. plugin>
    243. <plugin>
    244. <artifactId>maven-war-pluginartifactId>
    245. <version>3.2.2version>
    246. plugin>
    247. <plugin>
    248. <artifactId>maven-install-pluginartifactId>
    249. <version>2.5.2version>
    250. plugin>
    251. <plugin>
    252. <artifactId>maven-deploy-pluginartifactId>
    253. <version>2.8.2version>
    254. plugin>
    255. plugins>
    256. pluginManagement>
    257. build>
    258. project>

    2.配置 web.xml  交给spring进行管理

    1. <!-- shiro过滤器定义 -->
    2. <filter>
    3. <filter-name>shiroFilter</filter-name>
    4. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    5. <init-param>
    6. <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
    7. <param-name>targetFilterLifecycle</param-name>
    8. <param-value>true</param-value>
    9. </init-param>
    10. </filter>
    11. <filter-mapping>
    12. <filter-name>shiroFilter</filter-name>
    13. <url-pattern>/*</url-pattern>
    14. </filter-mapping>

    所有web.xml

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    4. version="3.1">
    5. <display-name>Archetype Created Web Application</display-name>
    6. <context-param>
    7. <param-name>contextConfigLocation</param-name>
    8. <param-value>classpath:applicationContext.xml</param-value>
    9. </context-param>
    10. <!-- 读取Spring上下文的监听器 -->
    11. <listener>
    12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    13. </listener>
    14. <!-- Spring MVC servlet -->
    15. <servlet>
    16. <servlet-name>SpringMVC</servlet-name>
    17. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    18. <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
    19. <init-param>
    20. <param-name>contextConfigLocation</param-name>
    21. <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
    22. </init-param>
    23. <load-on-startup>1</load-on-startup>
    24. <!--web.xml 3.0的新特性,是否支持异步-->
    25. <async-supported>true</async-supported>
    26. </servlet>
    27. <servlet-mapping>
    28. <servlet-name>SpringMVC</servlet-name>
    29. <url-pattern>/</url-pattern>
    30. </servlet-mapping>
    31. <!-- 中文乱码处理 -->
    32. <filter>
    33. <filter-name>encodingFilter</filter-name>
    34. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    35. <!--web.xml 3.0的新特性,是否支持异步-->
    36. <async-supported>true</async-supported>
    37. <init-param>
    38. <param-name>encoding</param-name>
    39. <param-value>UTF-8</param-value>
    40. </init-param>
    41. </filter>
    42. <filter-mapping>
    43. <filter-name>encodingFilter</filter-name>
    44. <url-pattern>/*</url-pattern>
    45. </filter-mapping>
    46. <!-- shiro过滤器定义 -->
    47. <filter>
    48. <filter-name>shiroFilter</filter-name>
    49. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    50. <init-param>
    51. <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理 -->
    52. <param-name>targetFilterLifecycle</param-name>
    53. <param-value>true</param-value>
    54. </init-param>
    55. </filter>
    56. <filter-mapping>
    57. <filter-name>shiroFilter</filter-name>
    58. <url-pattern>/*</url-pattern>
    59. </filter-mapping>
    60. </web-app>

    4.在这里新建一个包,里面放PasswordHelper.java

    1. package com.jwj.shiro;
    2. import org.apache.shiro.crypto.RandomNumberGenerator;
    3. import org.apache.shiro.crypto.SecureRandomNumberGenerator;
    4. import org.apache.shiro.crypto.hash.SimpleHash;
    5. /**
    6. * 用于shiro权限认证的密码工具类
    7. */
    8. public class PasswordHelper {
    9. /**
    10. * 随机数生成器
    11. * 生成的盐
    12. */
    13. private static RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
    14. /**
    15. * 指定hash算法为MD5
    16. * 采用什么加密方式
    17. */
    18. private static final String hashAlgorithmName = "md5";
    19. /**
    20. * 指定散列次数为1024次,即加密1024次
    21. * 加密1024次,解密也是1024次
    22. */
    23. private static final int hashIterations = 1024;
    24. /**
    25. * true指定Hash散列值使用Hex加密存. false表明hash散列值用用Base64-encoded存储
    26. * 你是不是base64位的进行存储
    27. */
    28. private static final boolean storedCredentialsHexEncoded = true;
    29. /**
    30. * 获得加密用的盐
    31. * 随机生成的盐
    32. * @return
    33. */
    34. public static String createSalt() {
    35. return randomNumberGenerator.nextBytes().toHex();
    36. }
    37. /**
    38. * 获得加密后的凭证
    39. * 生成一个秘密
    40. * @param credentials 凭证(即密码)
    41. * @param salt 盐
    42. * @return
    43. * 原始密码 + 盐 = 加密后的 返回值String就是加密后的
    44. */
    45. public static String createCredentials(String credentials, String salt) {
    46. SimpleHash simpleHash = new SimpleHash(hashAlgorithmName, credentials,
    47. salt, hashIterations);
    48. return storedCredentialsHexEncoded ? simpleHash.toHex() : simpleHash.toBase64();
    49. }
    50. /**
    51. * 进行密码验证
    52. * 校验我的密码
    53. *
    54. * @param credentials 未加密的密码
    55. * @param salt 盐
    56. * @param encryptCredentials 加密后的密码
    57. * @return
    58. *
    59. */
    60. public static boolean checkCredentials(String credentials, String salt, String encryptCredentials) {
    61. return encryptCredentials.equals(createCredentials(credentials, salt));
    62. }
    63. public static void main(String[] args) {
    64. //盐 生成随机的盐
    65. String salt = createSalt();
    66. System.out.println(salt);
    67. // 拿到盐生成的长度
    68. System.out.println(salt.length());
    69. //凭证+盐加密后得到的密码
    70. String credentials = createCredentials("123456", salt);
    71. System.out.println(credentials);
    72. // 加密后的长度
    73. System.out.println(credentials.length());
    74. // 拿到加密后的密码和原始化的密码如果为true,就代码加密成功了
    75. boolean b = checkCredentials("123456", salt, credentials);
    76. System.out.println(b);
    77. }
    78. }

    运行一下如图所示:
     

    123456 原始密码
    76925b1ed64ebf33185454c9da646394    盐
    32
    fc3a986b62b7c6710e9ee7cf26b5d917    加密后
    32
    true 

    拿到原始密码和盐以及加密后的密码做对比如果为true说明加密成功

    我们在运行一次看看这两者之间是不是一样的如图所示:

    可以看到明显的不一样了,盐不一样了也就会导致加密后的也不一样了

    如果说你有一万数据被泄露了,它要解密这些东西,它首先要拿到加密的次数(1024),要解密也的逐条进解密,因为我们每个加的盐都是不一样的。

    我们怎么拿到数据库里的数据

    我们查询的SQL语句也不一样了

    之前的SQL语句查询

    select * from t_oa_user where username='zs' and password=123456

    现在的SQL语句查询

    select * from t_oa_user where username='zs'

    假设:用户名:zhangsan   密码:zhangsan

    传递到后台 就能接收到这两个变量

    1.生成随机的盐

    2.利用 zhangsan 原始密码 + 生成的盐 = 得到加密后的密码

    3. 在执行 insert 语句

    二、shiro的认证 

    1.完成登录的方法 Mapper层的编写,接着就是biz层

    2.完成自定义realm(重点)

    3.Spring与shiro的整合(注意)

    4.测试

    1.完成登录的方法 Mapper层的编写和biz层 

     通过逆向工程将五张表生成对应的model、Mapper

    generatorConfig.xml        主要生成好了之后记得要把它切换掉为其他的

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="F:\\Courseware\\SoftwareInstallPath\\maven\\apache-maven-3.5.0-bin\\apache-maven-3.5.0-bin\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.jwj.ssm.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.jwj.ssm.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.jwj.ssm.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_shiro_user" domainObjectName="User"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. <table schema="" tableName="t_shiro_role" domainObjectName="Role"
    37. enableCountByExample="false" enableDeleteByExample="false"
    38. enableSelectByExample="false" enableUpdateByExample="false">
    39. table>
    40. <table schema="" tableName="t_shiro_permission" domainObjectName="Permission"
    41. enableCountByExample="false" enableDeleteByExample="false"
    42. enableSelectByExample="false" enableUpdateByExample="false">
    43. table>
    44. <table schema="" tableName="t_shiro_user_role" domainObjectName="UserRole"
    45. enableCountByExample="false" enableDeleteByExample="false"
    46. enableSelectByExample="false" enableUpdateByExample="false">
    47. table>
    48. <table schema="" tableName="t_shiro_role_permission" domainObjectName="RolePermission"
    49. enableCountByExample="false" enableDeleteByExample="false"
    50. enableSelectByExample="false" enableUpdateByExample="false">
    51. table>
    52. context>
    53. generatorConfiguration>

    我们这就生成好了如图所示:​​​​​​​​​​​​​​ 

    在我们的UserMapper.xml中 新增方法

    1. <!-- 通过用户名进行查询-->
    2. <select id="queryUserByUserName" resultType="com.jwj.ssm.model.User" parameterType="java.lang.String" >
    3. select
    4. <include refid="Base_Column_List" />
    5. from t_shiro_user
    6. where userName = #{userName}
    7. </select>

    UserMapper.java 也加上 我们刚刚写的方法

    1. package com.jwj.ssm.mapper;
    2. import com.jwj.ssm.model.User;
    3. import org.apache.ibatis.annotations.Param;
    4. import org.springframework.stereotype.Repository;
    5. //这个加也可以不加也可以,不加那边的实现方法就会报红,会感觉不舒服,加了就不会报红
    6. @Repository
    7. public interface UserMapper {
    8. int deleteByPrimaryKey(Integer userid);
    9. int insert(User record);
    10. int insertSelective(User record);
    11. User selectByPrimaryKey(Integer userid);
    12. int updateByPrimaryKeySelective(User record);
    13. int updateByPrimaryKey(User record);
    14. User queryUserByUserName(@Param("userName") String userName);
    15. }

    UserBiz.java

    1. package com.jwj.ssm.biz;
    2. import com.jwj.ssm.model.User;
    3. import org.apache.ibatis.annotations.Param;
    4. /**
    5. * @author 敢敢
    6. * @site www.javajwj.com
    7. * @company xxx公司
    8. * @create  2022-08-25 19:10
    9. */
    10. public interface UserBiz {
    11. int deleteByPrimaryKey(Integer userid);
    12. int insert(User record);
    13. int insertSelective(User record);
    14. User selectByPrimaryKey(Integer userid);
    15. int updateByPrimaryKeySelective(User record);
    16. int updateByPrimaryKey(User record);
    17. User queryUserByUserName(String userName);
    18. }

    实现类 UserBizImp.java

    1. package com.jwj.ssm.biz.impl;
    2. import com.jwj.ssm.biz.UserBiz;
    3. import com.jwj.ssm.mapper.UserMapper;
    4. import com.jwj.ssm.model.User;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. /**
    8. * @author 敢敢
    9. * @site www.javajwj.com
    10. * @company xxx公司
    11. * @create  2022-08-25 19:11
    12. */
    13. @Service("userBiz")
    14. public class UserBizImpl implements UserBiz {
    15. @Autowired
    16. private UserMapper userMapper;
    17. @Override
    18. public int deleteByPrimaryKey(Integer userid) {
    19. return userMapper.deleteByPrimaryKey(userid);
    20. }
    21. @Override
    22. public int insert(User record) {
    23. return userMapper.insert(record);
    24. }
    25. @Override
    26. public int insertSelective(User record) {
    27. return userMapper.insertSelective(record);
    28. }
    29. @Override
    30. public User selectByPrimaryKey(Integer userid) {
    31. return userMapper.selectByPrimaryKey(userid);
    32. }
    33. @Override
    34. public int updateByPrimaryKeySelective(User record) {
    35. return userMapper.updateByPrimaryKeySelective(record);
    36. }
    37. @Override
    38. public int updateByPrimaryKey(User record) {
    39. return userMapper.updateByPrimaryKey(record);
    40. }
    41. @Override
    42. public User queryUserByUserName(String userName) {
    43. return userMapper.queryUserByUserName(userName);
    44. }
    45. }

    2.自定义realm(重点)  

    MyRealm.java

    1. package com.jwj.ssm.shiro;
    2. import com.jwj.ssm.biz.UserBiz;
    3. import com.jwj.ssm.model.User;
    4. import org.apache.shiro.authc.AuthenticationException;
    5. import org.apache.shiro.authc.AuthenticationInfo;
    6. import org.apache.shiro.authc.AuthenticationToken;
    7. import org.apache.shiro.authc.SimpleAuthenticationInfo;
    8. import org.apache.shiro.authz.AuthorizationInfo;
    9. import org.apache.shiro.realm.AuthorizingRealm;
    10. import org.apache.shiro.subject.PrincipalCollection;
    11. import org.apache.shiro.util.ByteSource;
    12. import org.springframework.beans.factory.annotation.Autowired;
    13. /**
    14. * @author 敢敢
    15. * @site www.javajwj.com
    16. * @company xxx公司
    17. * @create  2022-08-25 19:19
    18. */
    19. public class MyRealm extends AuthorizingRealm {
    20. public UserBiz userBiz;
    21. public UserBiz getUserBiz() {
    22. return userBiz;
    23. }
    24. public void setUserBiz(UserBiz userBiz) {
    25. this.userBiz = userBiz;
    26. }
    27. /**
    28. * 授权
    29. * @param principalCollection
    30. * @return
    31. * shiro-web.ini
    32. */
    33. @Override
    34. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    35. return null;
    36. }
    37. /**
    38. * 认证
    39. * @param authenticationToken
    40. * @return
    41. * @throws AuthenticationException
    42. * shiro.ini
    43. */
    44. @Override
    45. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    46. // 拿到我们的用户名
    47. String userName = authenticationToken.getPrincipal().toString();
    48. User user = userBiz.queryUserByUserName(userName);
    49. // 拿到数据库中的用户信息,放入token凭证中,用于controler进行对比
    50. AuthenticationInfo info = new SimpleAuthenticationInfo(
    51. user.getUsername(),
    52. user.getPassword(),
    53. ByteSource.Util.bytes(user.getSalt()),
    54. this.getName() //realm的名字
    55. );
    56. return info;
    57. }
    58. }

    交给我们的spring进行管理

    applicationContext.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. 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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    7. <!--随着后续,框架会越学越多,不能讲所有的框架配置,放到同一个配置文件,否则不便于管理-->
    8. <import resource="applicationContext-mybatis.xml"></import>
    9. <import resource="applicationContext-shiro.xml"></import>
    10. </beans>

    3.Spring与shiro的整合(注意)

     ①shiro 在加载的时候,Spring上下文还没有加载完毕,所以@component与@autowised是不能使用的

    ② spring-shiro.xml 文件中,Myream需要依赖的业务类,由于没有被Spring配置,所以需要指定bean的id 通过@Service("具体的名字")

    applicationContext-shiro.xml

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="shiroRealm" class="com.jwj.ssm.shiro.MyRealm">
    6. <property name="userBiz" ref="userBiz" />
    7. <property name="credentialsMatcher">
    8. <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
    9. <property name="hashAlgorithmName" value="md5"/>
    10. <property name="hashIterations" value="1024"/>
    11. <property name="storedCredentialsHexEncoded" value="true"/>
    12. bean>
    13. property>
    14. bean>
    15. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    16. <property name="realm" ref="shiroRealm" />
    17. bean>
    18. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    19. <property name="securityManager" ref="securityManager" />
    20. <property name="loginUrl" value="/login"/>
    21. <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
    22. <property name="filterChainDefinitions">
    23. <value>
    24. /user/login=anon
    25. /user/updatePwd.jsp=authc
    26. /admin/*.jsp=roles[admin]
    27. /user/teacher.jsp=perms["user:update"]
    28. value>
    29. property>
    30. bean>
    31. <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    32. beans>

    LoginController.java

    1. package com.jwj.ssm.controller;
    2. import org.apache.shiro.SecurityUtils;
    3. import org.apache.shiro.authc.UsernamePasswordToken;
    4. import org.apache.shiro.subject.Subject;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import javax.servlet.http.HttpServletRequest;
    8. /**
    9. * @author 敢敢
    10. * @site www.javajwj.com
    11. * @company xxx公司
    12. * @create  2022-08-20 12:12
    13. */
    14. @Controller
    15. public class LoginController {
    16. // @RequestMapping("/login")
    17. // public String login(HttpServletRequest request){
    18. 登录成功一般需要 保存 用户信息
    19. // String uname = request.getParameter("uname");
    20. // if("zhangsan".equals(uname)){
    21. // request.getSession().setAttribute("uname",uname);
    22. // }
    23. // return "index";
    24. // }
    25. //
    26. // @RequestMapping("/logout")
    27. // public String logout(HttpServletRequest request){
    28. 做销毁
    29. // request.getSession().invalidate();
    30. // return "index";
    31. // }
    32. @RequestMapping("/login")
    33. public String login(HttpServletRequest request){
    34. try {
    35. String username = request.getParameter("username");
    36. String password = request.getParameter("password");
    37. // 生成令牌
    38. UsernamePasswordToken token = new UsernamePasswordToken(username,password);
    39. // 生成主体
    40. Subject subject = SecurityUtils.getSubject();
    41. // 拿到令牌进行登录
    42. subject.login(token);
    43. return "main";
    44. }catch (Exception e){
    45. request.setAttribute("message","账户密码错误...");
    46. return "login";
    47. }
    48. }
    49. @RequestMapping("/logout")
    50. public String logout(HttpServletRequest request){
    51. Subject subject = SecurityUtils.getSubject();
    52. subject.logout();
    53. return "login";
    54. }
    55. }

    4.测试

     把这个复制到我们的webapp下面

    运行结果它也就那到了我们的用户名和盐以及加密如图所示:

    最终运行结果如图所示:

    结论:doGetAuthenticationInfo认证方法是web层执行subject.login 方法触发的。

     三、总结

    1.盐加密 

    1.明文密码

    2.md5 加密      密文密码

    3.md5 加盐加密          一个明文对应多个密文

    4.md5 加盐加密加次数

    2.shiro 的认证 

    1.Mapper层        ——        通过账户名获取用户信息

    2.将用户信息给MyRealm 认证方法,认证的过程交给安全管理器

    3.MyRealm的配置,配置spring-shiro.xml 文件中

            ① shiro接管MyRealm的时候,还没有被Spring所接管导致@component与@autowised用不了

            ② 采用配置的形式配置UserBiz,需要给@service指定bean的名称

  • 相关阅读:
    使用docker搭建kafka集群、可视化操作台
    C++小结
    java计算机毕业设计vue校园菜鸟驿站管理系统源码+mysql数据库+系统+lw文档+部署
    分享3款ipad笔记工具,你们快来
    Ubuntu-server 22.04LTS源码编译apache服务器
    Python GDAL库在Anaconda环境中的配置
    vue观察属性和计算属性
    技术分享 | App测试时常用的adb命令你都掌握了哪些呢?
    疫情可视化part3
    使用jmh框架进行benchmark测试
  • 原文地址:https://blog.csdn.net/weixin_67465673/article/details/126529972