shiro登录认证

一,创建数据库

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`uname` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`pwd` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`address` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT
NULL,
`state` int(2) DEFAULT NULL,
`salt` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`uid`) USING BTREE,
UNIQUE INDEX `uname`(`uname`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE =
utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'admin', '727d8b2b4c59366d7ace58d4eda4cfee', '女',
'河南洛阳', 1, '9C2AB20283F9450389330033D64686DD');
INSERT INTO `user` VALUES (2, 'zs', '83f12ba7c4357b87167e240a22c15248', '男', '河
南郑州', 1, '262F995823C94D1CAE7596B47E8AB657');
select * from user

二,创建web项目并配置SSM

 完成user表的dao层和service层的书写
@Repository
public interface UserMapper {
    @Select("select * from user where uname=#{uname}")
    User selectByUname(String uname);
}

三,创建MyRealm继承AuthorizingRealm

//shiro 进行认证操作
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken
token) throws AuthenticationException {
//token 是主体传过来的身份令牌
//1 获取用户身份信息
String uname = token.getPrincipal().toString();
//2 调用业务层获取用户信息(数据库中)
User user = userService.findByUname(uname);
//3 判断并将数据完成封装
if(user!=null){
AuthenticationInfo authenticationInfo=new SimpleAuthenticationInfo(
token.getPrincipal(), //令牌身份信息对象
user.getPwd(), //用户数据库的密码
ByteSource.Util.bytes(user.getSalt().getBytes()), //加密时的
盐值
uname // 用户名
);
return authenticationInfo;
}
return null;
}

四,在spring.xml中配置shiro管理器和自定义的realm

<!--=================shiro相关配置====================-->
<!--配置shiro进行校验时的加密规则-->
<bean id="credentialsMatcher"
class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<!--加密规则-->
<property name="hashAlgorithmName" value="MD5" />
<!--是否加盐-->
<property name="hashSalted" value="true" />
<!--是否增加哈希算法进行散列-->
<!-- <property name="hashIterations" value="1024" />-->
</bean>
<!--配置自定义Realm-->
<bean id="myRealm" class="com.chen.shiro.MyRealm">
<property name="credentialsMatcher" ref="credentialsMatcher" />
</bean>
<!--配置安全管理器,使用自定义的Realm-->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--配置自定义的Realm-->
<property name="realm" ref="myRealm" />
</bean>
<!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 -->
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 调用我们配置的权限管理器 -->
<property name="securityManager" ref="securityManager"/>
<!-- 配置拦截后我们的登录请求地址 -->
<property name="loginUrl" value="/loginUI"/>
<!-- 如果您请求的资源不再您的权限范围,则跳转到错误页面 -->
<property name="unauthorizedUrl" value="/error"/>
<!-- 权限配置
anon:任何人都可以访问; authc:必须是登录之后才能进行访问,不包括remember
me;
perms:指定过滤规则,可以自己拓展权限配置; roles:配置角色;
user:登录用户才可以访问,包含remember me; logout:退出
-->
<property name="filterChainDefinitions">
<value>
/=anon
/index = anon
/loginUI = anon
/login = anon
/WEB-INF/view/login.html = anon
/**/*.js=anon
/**/*.css=anon
/**=authc
/**=user
</value>
</property>
</bean>
权限配置
anon :任何人都可以访问;
authc :必须是登录之后才能进行访问,不包括 remember me
perms :指定过滤规则,可以自己拓展权限配置;
roles :配置角色;
user :登录用户才可以访问,包含 remember me
logout :退出

五,web.xml中配置shiro过滤器

<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filterclass>
<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>

六,在controller中进行shiro认证

@Controller
public class UserController {
@RequestMapping("/login")
public String login(String uname, String pwd, HttpSession session){
//1 获取 Subject 对象
Subject subject = SecurityUtils.getSubject();
//2 封装请求数据到 token 对象中
AuthenticationToken token = new
UsernamePasswordToken(uname,pwd);
//3 调用 login 方法进行登录认证
try {
subject.login(token);
session.setAttribute("user",token.getPrincipal().toString());
return "main";
} catch (UnknownAccountException e){
System.out.println("用户名不存在");
return "login";
} catch (IncorrectCredentialsException e){
System.out.println("密码错误");
return "login";
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("登录失败");
return "login";
}
shiro的rememberMe功能
Shiro 提供了记住我(RememberMe)的功能,比如访问一些网站时,关闭了浏览器, 下次再打
开时还是能记住你是谁, 下次访问时无需再登录即可访问。
例如:当没有登录时,访问/main主页,会被拦截跳转到登录页面。当登录后是可以正常访
问/main的主页的;如果使用了记住我功能,会在浏览器写入cookie,关掉浏览器不需要登录即可
直接访问/main。
基本流程
1. 首先在登录页面选中 RememberMe 然后登录成功;如果是浏览器登录,一般会 把
RememberMe 的 Cookie 写到客户端并保存下来;
2. 关闭浏览器再重新打开;会发现浏览器还是记住你的;
3. 访问一般的网页服务器端,仍然知道你是谁,且能正常访问;
4. 但是,如果我们访问电商平台时,如果要查看我的订单或进行支付时,此时还 是需要再进行身份认
证的,以确保当前用户还是你。
1.在spring.xml中配置cookie的设置和rememberMe管
理器
1.配置记住我功能的cookie设置;
2.配置记住我功能的管理器;
3.在安全管理器中引用记住我功能的管理器;
4.在过滤器中shiroFilter配置rememberMe的过滤配置(/**=user)
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值