shrio教程初級(二)基於url攔截-用戶認證 -开发者知识库

shrio教程初級(二)基於url攔截-用戶認證 -开发者知识库,第1张

一、前言

第一篇我們注意講解了一些基礎。接下來我們看看具體權限解決方案。

二、權限解決方案

2.1 資源分類

針對第一篇中的出現資源分類,這里做強調講解。資源分類注意包括:粗粒度和細粒度。

1、粗粒度權限:資源權限類型的管理。例如:部門操作、用戶信息操作    統一攔截處理(可框架)

2、細粒度權限:資源權限類型實例的管理。具體到相應數據集。例如:銷售部操作、ycy用戶信息操作  業務層處理

例如:user類   與  張三的關系

三、基於URL的攔截

3.1基礎框架搭建

由於主要講解權限框架,所以springMVC mybatis的東西,不懂的同學請移步springMVC教程和mybatis教程。除此之外還有easyui的一些前端東西, 這個你懂且可以,本人一向不擅長前端,只是會用,要高端的js我也搞不出(也不建議搞java的人去攻前端)。建議框架選擇:直接從我的git上面下載,或者用springmvc教程項目改。

3.2基於url攔截-用戶認證實現

shrio教程初級(二)基於url攔截-用戶認證 -开发者知识库,第2张
看圖說話:綠色即是我們的用戶認證,藍色為權限控制。暫時我們只看認證 1、用戶認證思路:通過用戶身份和密碼進行認證,如果認真通過,則保存在session里面。
接下來我們按照底層到頁面開始開發:dao-mapper-service-controller-intercepter-web頁面

3.2.1 建立service與mapper:完成認證

mapper:

SysUserMapper.java:
package com.ycy.mapper;

import java.util.List;

import com.ycy.model.SysUser;
import org.apache.ibatis.annotations.Param;

public interface SysUserMapper {
/**
* 根據用戶查詢用戶系統信息
* @param usercode
* @return
*/
List<SysUser> getSysUserByUserCode(String usercode);

}

mapper.xml

SysUserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ycy.mapper.SysUserMapper" >
<resultMap id="BaseResultMap" type="com.ycy.model.SysUser" >
<id column="id" property="id" jdbcType="VARCHAR" />
<result column="usercode" property="usercode" jdbcType="VARCHAR" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="password" property="password" jdbcType="VARCHAR" />
<result column="salt" property="salt" jdbcType="VARCHAR" />
<result column="locked" property="locked" jdbcType="CHAR" />
</resultMap>
<!--基礎屬性-->
<sql id="Base_Column_List" >
id, usercode, username, password, salt, locked
</sql>
<!--根據用戶名查詢系統用戶-->
<select id="getSysUserByUserCode" resultMap="BaseResultMap" parameterType="map" >
select
<include refid="Base_Column_List" />
from sys_user
WHERE usercode=#{usercode}
</select>
</mapper>

SysService:

package com.ycy.service;
import com.ycy.model.ActiveUser;
import java.util.List;

/**
*
* <p>Title: SysService</p>
* <p>Description: 認證授權服務接口</p>
*/
public interface SysService {

//根據用戶的身份和密碼 進行認證,如果認證通過,返回用戶身份信息
public ActiveUser authenticat(String userCode, String password) throws Exception;

}

ItemsServiceImpl

package com.ycy.service.impl;

import java.util.List;

import com.ycy.Exception.CustomException;
import com.ycy.mapper.SysUserMapper;
import com.ycy.model.ActiveUser;
import com.ycy.model.SysUser;
import com.ycy.service.SysService;
import com.ycy.util.MD5;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
*
* <p>Title: SysServiceImpl</p>
* <p>Description:認證和授權的服務接口 </p>
*/
@Service
public class SysServiceImpl implements SysService {

@Autowired
private SysUserMapper sysUserMapper;


@Override
public ActiveUser authenticat(String userCode, String password)
throws Exception {
/**
認證過程:
根據用戶身份(賬號)查詢數據庫,如果查詢不到用戶不存在
對輸入的密碼 和數據庫密碼 進行比對,如果一致,認證通過
*/
//根據用戶賬號查詢數據庫
SysUser sysUser = this.findSysUserByUserCode(userCode);

if(sysUser == null){
//拋出異常
throw new CustomException("用戶賬號不存在");
}

//數據庫密碼 (md5密碼 )
String password_db = sysUser.getPassword();

//對輸入的密碼 和數據庫密碼 進行比對,如果一致,認證通過
//對頁面輸入的密碼 進行md5加密
String password_input_md5 = new MD5().getMD5ofStr(password);
if(!password_input_md5.equalsIgnoreCase(password_db)){
//拋出異常
throw new CustomException("用戶名或密碼 錯誤");
}
//得到用戶id
String userid = sysUser.getId();
//認證通過,返回用戶身份信息
ActiveUser activeUser = new ActiveUser();
activeUser.setUserid(sysUser.getId());
activeUser.setUsercode(userCode);
activeUser.setUsername(sysUser.getUsername());//用戶名稱
return activeUser;
}

//根據用戶賬號查詢用戶信息
private SysUser findSysUserByUserCode(String userCode)throws Exception{
List<SysUser> list = sysUserMapper.getSysUserByUserCode(userCode);
if(list!=null && list.size()==1){
return list.get(0);
}
return null;
}

}

3.2.2 controller:完成數據認證與保存session

LoginController.java:
package com.ycy.controller;

import javax.servlet.http.HttpSession;

import com.ycy.Exception.CustomException;
import com.ycy.model.ActiveUser;
import com.ycy.service.SysService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
*
* <p>Title: LoginController</p>
* <p>Description: 登陸和退出</p>
*/
@Controller
public class LoginController {

@Autowired
private SysService sysService;
//用戶登陸提交方法
@RequestMapping("/login")
public String login(HttpSession session,String usercode,String password,String randomcode)throws Exception{

//校驗驗證碼
//從session獲取正確的驗證碼
String validateCode = (String)session.getAttribute("validateCode");
if(!randomcode.equals(validateCode)){
//拋出異常:驗證碼錯誤
throw new CustomException("驗證碼 錯誤 !");
}
//用戶身份認證
ActiveUser activeUser = sysService.authenticat(usercode, password);
//記錄session
session.setAttribute("activeUser", activeUser);
//重定向到商品查詢頁面
return "redirect:/first";
}

//用戶退出
@RequestMapping("/logout")
public String logout(HttpSession session)throws Exception{
//session失效
session.invalidate();
//重定向到商品查詢頁面
return "redirect:/items/queryItems";

}


}

3.2.3用戶身份認證攔截器:擁有權限驗證

package com.ycy.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.ycy.model.ActiveUser;
import com.ycy.util.ResourcesUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;

/**
*
* <p>Title: HandlerInterceptor1</p>
* <p>Description: 用戶身份認證攔截器</p>
*/
public class LoginInterceptor implements HandlerInterceptor {

//在執行handler之前來執行的
//用於用戶認證校驗、用戶權限校驗
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//得到請求的url
String url = request.getRequestURI();
//判斷是否是公開 地址
//實際開發中需要公開 地址配置在配置文件中
//從配置中取逆名訪問url
List<String> open_urls = ResourcesUtil.gekeyList("config/anonymousURL");
//遍歷公開 地址,如果是公開 地址則放行
for(String open_url:open_urls){
if(url.indexOf(open_url)>=0){
//如果是公開 地址則放行
return true;
}
}
//判斷用戶身份在session中是否存在
HttpSession session = request.getSession();
ActiveUser activeUser = (ActiveUser) session.getAttribute("activeUser");
//如果用戶身份在session中存在放行
if(activeUser!=null){
return true;
}
//執行到這里攔截,跳轉到登陸頁面,用戶進行身份認證
request.getRequestDispatcher("/pages/jsp/login.jsp").forward(request, response);

//如果返回false表示攔截不繼續執行handler,如果返回true表示放行
return false;
}
//在執行handler返回modelAndView之前來執行
//如果需要向頁面提供一些公用 的數據或配置一些視圖信息,使用此方法實現 從modelAndView入手
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("HandlerInterceptor1...postHandle");

}
//執行handler之后執行此方法
//作系統 統一異常處理,進行方法執行性能監控,在preHandle中設置一個時間點,在afterCompletion設置一個時間,兩個時間點的差就是執行時長
//實現 系統 統一日志記錄
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("HandlerInterceptor1...afterCompletion");
}

}

3.2.3easyUI等問題

關於easyui與驗證碼的視頻和教程網上很多。建議去看看。這里你最好下載我們的項目修改,或者直接用我項目吧。前端是苦逼的。

3.3基於url攔截-用戶認證實現測試

shrio教程初級(二)基於url攔截-用戶認證 -开发者知识库,第3张


登錄之后界面===============================================================================================================================

shrio教程初級(二)基於url攔截-用戶認證 -开发者知识库,第4张

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复