Shiro---自定义Realm进行认证

本文详细介绍如何使用Shiro框架实现用户认证过程,包括自定义Realm、数据库查询用户信息、异常处理及配置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.步骤总结

1.定义一个类MyRelam,让它继承AuthenticatingRealm

2.重写doGetAuthenticationInfo方法,在里面进行认证,这个方法的参数就是Token,也就是客户端传过来的用户名和密码

3.获取Token中的username和password

  UsernamePasswordToken token = (UsernamePasswordToken) upToken;
        String username = token.getUsername();
        char[] password = token.getPassword();

4.根据用户名从数据库中查询用户

   //从数据库中查询数据
        try {
            Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "admin");
            PreparedStatement ps = connection.prepareStatement("select * from t_shiro where username=?");
            ps.setString(1, username);
            ResultSet rs = ps.executeQuery();
            User user = null;
            if (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setSalt(rs.getString("salt"));
            }

5.判定user是否为空,如果为null,则直接抛UnknownAccountException异常

  if (user == null) {
   throw new UnknownAccountException("用户名不存在");
   }

6.不为空的话就新建SimpleAuthenticationInfo对象,并返回该对象
新建的时需要传入三个参数:

1)第一个参数:这个参数的作用是在授权时根据这个参数去数据库中查询用户,一般是传入整个对象,或者是对象的id
2)第二个参数是从数据库查询出来的密码
3)第三个参数自定义。但是尽量不重复了。常直接使用用户名当做realname名字

 if(username.equals("admin")){//假设用户名为admin时能从数据库中查询出来
            //根据之前查询出来的用户信息获取密码。假设查询出来的密码是pwd
            String password= "pwd";
            //此处需要注意,第二个参数是从数据库查询出来的密码,而不是传递过来的密码。
            //第三个参数自定义。但是尽量不重复了。常直接使用用户名当做realname名字。
            AuthenticationInfo info = new SimpleAuthenticationInfo(user,password,"realmname");
            //shiro会判断从数据库查询出来的密码和客户端传递过来的密码是否一致。
            return info;

7.在ini文件中配置

[main]
myrealm= com.yrp.realm.MyRealmAuthorizing
securityManager.realms=$myrealm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值