使用Shiro 實現登入
阿新 • • 發佈:2019-01-05
專案的目錄結構
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 />
密 碼: <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;
}