1. 程式人生 > >使用Shiro 實現登入

使用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;
    }