使用Shiro 实现登录

项目的目录结构

这里写图片描述

1、login.jsp

<script type="text/javascript">

    function doLogin(){

        var username = $("#username").val();
        var password = $("#password").val();
        $.ajax({
               type: "POST",
               url: "login",
               data: "username="+username+"&password=" + password,
               success: function(msg){
                 alert( "Data Saved: " + msg );
               }
            });
    } 

</script>

<body>

    <form action="login" name="loginForm">

        用户名:<input type="text" name = "username" id = "username" />
        <br />
        <br />
        密&nbsp;码: <input type="text" name = "password" id = "password" />
        <br />
        <br />
        <button type="button" name = "submitForm" id = "submitForm" onclick="doLogin()">登录</button>     
    </form>

</body>

2、LoginController

    @RequestMapping(value = "login", method = RequestMethod.POST)
    @ResponseBody
    public String doLogin(String username, String password){

        // 获取当前的Subject
        Subject currentUser = SecurityUtils.getSubject();

        // 测试当前的用户是否已经被认证,即是否已经登陆
        // 调用Subject的isAuthenticated
        if (!currentUser.isAuthenticated()) {
            // 把用户名和密码封装为UsernamePasswordToken 对象
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            token.setRememberMe(true);
            try {
                // 执行登陆
                currentUser.login(token);
            } catch (AuthenticationException ae) {
                System.out.println("登录失败--->" + ae.getMessage());
            }
        }

        return "success";
    }   

3、LoginRealm

public class LoginRealm extends AuthenticatingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        // 1、把AuthenticationToken转换为UsernamePasswordToken
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;

        // 2、从UsernamePasswordToken中获取username
        String username = usernamePasswordToken.getUsername();

        // 3、调用数据库的方法,从数据库中查询username对应的用户记录
        System.out.println("从数据库中查询");

        // 4、若用户不存在,则抛出UnknownAccountException异常
        if (null == username){
            throw new UnknownAccountException("用户不存在");
        }

        // 5、根据用户信息情况,决定是否需要抛出其他的AuthenticationException异常
        if ("else".equals(username)){
            throw new LockedAccountException("用户被锁定");
        }

        // 6、根据用户的情况,来构建AuthenticationInfo对象返回,通常使用的实现类为:SimpleAuthenticationInfo
        // 以下信息是从数据库中获取的
        // 参数 : principal ---> 认证的实体信息,可以是username,也可以是数据表对应的用户实体类对象
        Object principal = username;
        // 参数 :credentials ---> 密码
        Object credentials = "123456";
        // 参数 : realmName ---> 当前realm对象的name。调用父类的getName()方法即可
        String realmName = this.getName();
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);

        return info;
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值