目录
- 1. 集成shiro
- 1.1 导入依赖的包
- 1.2 web.xml配置
- 2. 开发自定义Realm
- 2.1 创建测试数据表
- 2.2 Model
- 2.3 编写后台支持服务
- 2.3.1 定义mapper接口:
- 2.3.2 mybatis配置文件:
- 2.3.3 编写service及接口,(接口截图忽略)
- 2.4 单元测试
- 2.5 编写自定义的Realm
- 2.6 配置文件
- 2.7 登录Controller
- 2.9 登录页面
- 3. 加密
- 3.1 工具类
- 3.2 shiro加密认证
- 3.2.1 spring中bean的配置
- 3.2.2 自定义Realm中使用加密
1. 集成shiro
1.1 导入依赖的包
导入shiro需要的依赖包
<shiro-version>1.2.5</shiro-version>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro-version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>${shiro-version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro-version}</version>
</dependency>
1.2 web.xml配置
<!-- shiro -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. 开发自定义Realm
2.1 创建测试数据表
随课件提供的资料目录中有脚本(shiro-data.sql)
2.2 Model
生成系统用户表(t_sys_user)对应的model,Idea中可以使用Hibernate查询生成,具体步骤省略。
2.3 编写后台支持服务
编写对应的service,mapper(数据访问层)的实现(service,mapper接口,及对应的xml)
2.3.1 定义mapper接口:
2.3.2 mybatis配置文件:
<resultMap id="userMap" type="com.zking.mybatis01.model.TSysUser">
<id column="userid" property="userid" javaType="java.lang.Integer"/>
<result column="username" property="username" javaType="java.lang.String"/>
<result column="PASSWORD" property="password" javaType="java.lang.String"/>
<result column="salt" property="salt" javaType="java.lang.String"/>
<result column="createdate" property="createdate" javaType="java.util.Date"/>
</resultMap>
2.3.3 编写service及接口
2.4 单元测试
对service进行单元测试
2.5 编写自定义的Realm
shiro中的Realm UML:
2.6 配置文件
添加spring相关配置,使用自定义Realm进行认证 (资料:applicationContext-shiro.xml)
<!--配置自定义的Realm-->
<bean id="shiroRealm" class="com.zking.mybatis01.shiro.UserRealm">
</bean>
<!--注册安全管理器-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="shiroRealm" />
</bean>
<!--Shiro核心过滤器-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- Shiro的核心安全接口,这个属性是必须的 -->
<property name="securityManager" ref="securityManager" />
<!-- 身份验证失败,跳转到登录页面 -->
<property name="loginUrl" value="/"/>
<!-- 身份验证成功,跳转到指定页面 -->
<!--<property name="successUrl" value="/index.jsp"/>-->
<!-- 权限验证失败,跳转到指定页面 -->
<!--<property name="unauthorizedUrl" value="/user/noauthorizeUrl"/>-->
<!-- Shiro连接约束配置,即过滤链的定义 -->
<property name="filterChainDefinitions">
<value>
<!--
注:anon,authcBasic,auchc,user是认证过滤器
perms,roles,ssl,rest,port是授权过滤器
-->
<!--anon 表示匿名访问,不需要认证以及授权-->
<!--authc表示需要认证 没有进行身份认证是不能进行访问的-->
<!--roles[admin]表示角色认证,必须是拥有admin角色的用户才行-->
/user/login=anon
/book/**=authc
/common/**=authc
<!-- /css/** = anon
/images/** = anon
/js/** = anon
/ = anon
/user/logout = logout
/user/** = anon
/userInfo/** = authc
/dict/** = authc
/console/** = roles[admin]
/** = anon-->
</value>
</property>
</bean>
<!-- Shiro生命周期,管理shiro bean的生命周期 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
2.7 登录Controller
2.9 登录页面
<body>
<h1>登录页面</h1>
${message}
<form id="loginForm" action="<%=request.getContextPath()%>/user/login" method="post">
<input type="text" id="username" name="username"/> <br/>
<input type="text" id="password" name="password"/> <br/>
<input type="submit" value="登录"/>
</form>
</body>
通过登录页面验证用户认证。
3. 加密
3.1 工具类
随课件提供工具类:PasswordHelper.java,该类用于演示,shiro中有自己的MD5实现。
注: MD5
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5算法是不可逆的,即便得到了加密以后的密文,也不可能通过解密算法反算出明文。
用途:
1)密码管理,如用户密码的MD5加密后再保存数据库
2)电子签名,MD5 算法还可以作为一种电子签名的方法来使用,使用 MD5算法就可以为任何文件(不管其大小、格式、数量)产生一个独一无二的“数字指纹”,借助这个“数字指纹”,通过检查文件前后 MD5 值是否发生了改变,就可以知道源文件是否被改动。(回想一下JWT的令牌签名)
3.2 shiro加密认证
3.2.1 spring中bean的配置
配置自定义的Realm。
<!--配置自定义的Realm-->
<bean id="shiroRealm" class="com.zking.mybatis01.shiro.UserRealm">
<property name="credentialsMatcher">
<bean id="credentialsMatcher"class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!--指定hash算法为MD5-->
<property name="hashAlgorithmName" value="md5"/>
<!--指定散列次数为1024次-->
<property name="hashIterations" value="1024"/>
<!--true指定Hash散列值使用Hex加密存. false表明hash散列值用用Base64-encoded存储-->
<property name="storedCredentialsHexEncoded" value="true"/>
</bean>
</property>
</bean>
3.2.2 自定义Realm中使用加密