wisdomsell-day6-登錄與角色
1.準備一個加密算法
public class MD5Util {
//設置鹽值
public static final String SALT = “wgl”;
//設置遍歷次數
public static final int HASHITERATIONS = 10;
//傳入一個字符串,返回一個md5編碼的值
public static String createMd5Str(String str) {
//傳入的解碼的方式,密碼源,鹽加密方式,迭代次數
SimpleHash hash = new SimpleHash(“MD5”, str, SALT, HASHITERATIONS);
return hash.toString();
}
}
2.通過算法改變數據庫的密碼
@Override
public void save(Employee employee) {
if (employee.getId() == null) {
//傳入id修改密碼
employee.setPassword(MD5Util.createMd5Str(employee.getPassword()));
}
employeeRepository.save(employee);
}
**3.因為添加員工時必須加密所以重新寫一個員工保存**
@Override
public void save(Employee employee) {
if (employee.getId() == null) {
//傳入id修改密碼
employee.setPassword(MD5Util.createMd5Str(employee.getPassword()));
}
employeeRepository.save(employee);
}
3.準備一個登陸頁面,配置xml和資源文件的訪問權限
**xml**
資源文件
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!-- 登錄路徑:如果沒有登錄,就會跳到這里來 -->
<property name="loginUrl" value="/login"/>
<!-- 登錄成功后的跳轉路徑 -->
<property name="successUrl" value="/main"/>
<!-- 沒有權限跳轉的路徑 -->
<property name="unauthorizedUrl" value="/s/unauthorized.jsp"/>
<property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"/>
<!--引用自定義過濾器-->
<property name="filters">
<map>
<entry key="wglPer" value-ref="wglPer"></entry>
</map>
</property>
</bean>
設置靜態資源放行
通過一個map集合完成
public class FilterChainDefinitionMapFactory {
@Autowired
private IPermissionService permissionService;
public Map<String, String> builderFilterChainDefinitionMap() {
//使用LinkedHashMap -> 保證是有順序的
Map<String, String> maps = new LinkedHashMap<>();
//在maps中加上數據
//設置放行
maps.put("/login", "anon");
maps.put("*.js", "anon");
maps.put("*.css", "anon");
maps.put("/css/**", "anon");
maps.put("/js/**", "anon");
maps.put("/img/**", "anon");
maps.put("/easyui/**", "anon");
maps.put("/images/**", "anon");
//1.拿到所有權限
List<Permission> permissions = permissionService.findAll();
//2.遍歷權限,拿到權限與資源
for (Permission permission : permissions) {
String url = permission.getUrl();//資源
String sn = permission.getSn();//權限
//把路徑與資源放到攔截中去
maps.put(url,"wglPer["+sn+"]");
}
//設置所有攔截
maps.put("/**", "authc");
return maps;
}
}
4.完成登錄功能
登錄驗證
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//1.拿到令牌
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
//2.根據令牌獲到username -> 拿到密碼(沒有密碼返回null)
String username = token.getUsername();
Employee loginUser = iEmployeeService.findByUsername(username);
if (loginUser == null) {
return null;
}
String password1 = loginUser.getPassword();
//設置鹽值
ByteSource salt = ByteSource.Util.bytes(“wgl”);
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(loginUser, password1, salt, getName());
return authenticationInfo;
}
完成登錄
@RequestMapping(value="/login",method = RequestMethod.POST)
@ResponseBody
public JsonResult login(String username, String password){
//1.拿到當前用戶
Subject currentUser = SecurityUtils.getSubject();
//2.如果沒有登錄,進行登錄
if(!currentUser.isAuthenticated()){
//3.準備令牌
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//4.實現登錄
try {
currentUser.login(token);
} catch (UnknownAccountException e) {
e.printStackTrace();
return new JsonResult(false, “用戶名不存在!”);
} catch (IncorrectCredentialsException e) {
e.printStackTrace();
return new JsonResult(false, “賬號或密碼錯誤!”);
} catch (AuthenticationException e) {
e.printStackTrace();
// System.out.println(“就是登錄不了(請聯系程序員…)”);
return new JsonResult(false, “網絡出錯(聯系管理員)!”);
}
}
//登錄成功成功令牌
return new JsonResult();
}
控制層
@RequestMapping(value = “/login”, method = RequestMethod.GET)
public String index() {
return “login”;
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public JsonResult login(String username, String password) {
//1.拿到subject(當前用戶)
Subject subject = SecurityUtils.getSubject();
//2.如果沒有登錄,放它登錄
if (!subject.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
} catch (UnknownAccountException e) {
e.printStackTrace();
return new JsonResult(false,"用戶名出錯");
} catch (IncorrectCredentialsException e) {
e.printStackTrace();
return new JsonResult(false,"用戶名或者密碼錯誤");
} catch (AuthenticationException e) {
System.out.println("未知錯誤");
return new JsonResult(false,"未知錯誤");
}
}
UserContext.putUser();
//成功到主頁面
return new JsonResult();
}
@RequestMapping("logout")
public String logout(){
//獲取當前用戶
Subject subject = SecurityUtils.getSubject();
//退出登錄
subject.logout();
return "redirect:/login";
}
小功能
1.回車登錄
$(document.documentElement).on(“keyup”, function(event) {
//console.debug(event.keyCode);
var keyCode = event.keyCode;
console.debug(keyCode);
if (keyCode === 13) { // 捕獲回車
submitForm(); // 提交表單
}
});
.2.登錄過期問題
// 檢查自己是否是頂級頁面
if (top != window) {// 如果不是頂級
//把子頁面的地址,賦值給頂級頁面顯示
window.top.location.href = window.location.href;
}
5.權限
關系
用戶----多對多—角色–多對多—權限- 多種方案—資源
權限和資源之間的關系分:一對一,多對一,多對多
注意
@JsonIgnore //生成json是忽略這個屬性(數據大多,全部拿到沒有意義,還有可能造成死循環)
private Set roles = new HashSet<>();
3.3.4.完善權限頁面
名稱: | |
資源路徑: | |
權限: | |
描述: |
4.角色管理(頁面功能)
4.1.準備角色數據顯示
4.1.1.role.jsp
4.1.2.role.js
function formatperms(val){
var persStr = “” ;
for(var i=0;i<val.length;i++){
var permission = val[i];
persStr += permission.name;
if(i<val.length-1){
persStr+=",";
}
}
return persStr;
}
4.2.添加修改角色
role.js
…
//用戶權限列表
var userPermissionGrid =KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#?userPermissionG…("#allPermissionGrid");
…
var itsource={
… //添加數據(彈出添加的模態框)
add:function () {
//如果有data-save屬性,我們把它展示出來
$("[data-save]").show();
//啟動有data-save屬性的input元素的驗證功能
$("[data-save] input").validatebox(“enableValidation”);
roleForm.form(“clear”);//清除數據
//彈出表單窗口
roleDialog.dialog(“center”).dialog(‘open’);
//當前用戶權限清空
userPermissionGrid.datagrid(“loadData”,[]);
},
//修改數據(彈出修改的模態框)
edit:function () {
//選中了某一條數據才刪除
var row = roleGrid.datagrid(“getSelected”);
if(row){
//隱藏有data-save屬性的元素
$("[data-save]").hide();
//禁用有data-save屬性的input元素的驗證功能
$("[data-save] input").validatebox(“disableValidation”);
roleForm.form("clear");//清除數據
roleDialog.dialog("center").dialog('open');
//為form加載數據
roleForm.form("load",row);
//單獨解決權限的回顯問題(注意,這里要準備一個新的權限,以免刪除時出問題)
var permissions = [];
$.extend(permissions,row.permissions);
userPermissionGrid.datagrid("loadData",permissions);
}else{
$.messager.alert('提示信息','請選擇一行再進行修改!','info');
}
},
…
//雙擊所有權限,把一個權限交給這個角色
addPermission:function(rowIndex, rowData){
//判斷是否有重復的行
//1.拿到角色權限所有的行數據
var rows = userPermissionGrid.datagrid("getRows");
//2.遍歷rows拿到每一個員工數據
for(var i=0;i<rows.length;i++){
var row = rows[i]; //3.判斷如果出現相等數據的情況
if(row.id == rowData.id){
//不做任何操作(也可以給出提示)
$.messager.show({
title:'提示',
msg:'該權限已經添加!',
timeout:2000,
showType:'slide'
});
return;
}
}
//把數據加到相應角色權限Grid中
userPermissionGrid.datagrid("appendRow",rowData);
},
//雙擊后移動相應的權限
removePermission:function (rowIndex, rowData) {
userPermissionGrid.datagrid("deleteRow",rowIndex);
}
}
//我們在這里創建兩個Grid
//1.創建當前角色的權限Grid
userPermissionGrid.datagrid({
fit:true,
fixed:true,
fitColumns:true,
//雙擊后移除權限
onDblClickRow:itsource.removePermission
})
//2.獲取所有權限的Grid
allPermissionGrid.datagrid({
fit:true,
fixed:true,
fitColumns:true,
//toolbar:’#tb’,
// singleSelect:true";
url:"/permission/page",
rownumbers:“true” ,
pagination:“true”,
//雙擊后添加權限
onDblClickRow:itsource.addPermission
})
4.3.保存數據
var itsource={
//保存數據
save:function () {
var url = “/role/save”;
var id = $("#roleId").val();
if(id){
url = “/role/update?cmd=update”;
}
roleForm.form(‘submit’, {
url:url,
//這里我們加上params,可以通過這個參數修改咱們的提交數據
onSubmit: function(param){
//得到所有明細
var rows = userPermissionGrid.datagrid(“getRows”);
//準備傳參數據(權限多條數據,是個數組)
//param.permissions = [];
for(var i=0;i<rows.length;i++){
//設置相應的數據值
param[“permissions[”+i+"].id"] =rows[i].id;
}
//做驗證
return roleForm.form("validate");
},
success:function(data){
var result = JSON.parse(data);//轉成相應的json數據
if(result.success) {
roleGrid.datagrid('reload');
roleDialog.dialog('close');
}else{
$.messager.alert('提示信息','操作失敗!,原因:'+result.msg,"error");
}
}
})
}
}
/**
- 特性:在執行相應方法之前都會先執行這個方法
*/
@ModelAttribute(“editRole”)
public Role beforeEdit(Long id, String cmd){
//有id的時候-> 修改功能
if(id!=null && “update”.equals(cmd)) {
Role role = roleService.findOne(id);
//把這個要修改的關聯對象設置為null,可以解決n-to-n的問題
role.getPermissions().clear();
return role;
}
return null;
}
修改的時候只能添加不能減少
@ModelAttribute(“editRole”)
public Role beforeEdit(Long id,String cmd){
//修改的時候才查詢(只要有id會就進行一次查詢,這是不對的)
if(id!=null && “update”.equals(cmd)) {
Role role = roleService.findOne(id);
//把要傳過來的關聯對象都清空,就可以解決n-to-n的問題
role.getPermissions().clear();
return role;
}
return null;
}
智能推薦
mysql高級【6】:mysql用戶、角色的管理(單用戶多角色等)
講了這么多可以發現很多的操作都是基于root(最高權限的用戶)用戶的,但是有的用戶是新增的,不可能所有的人都有最高權限嘛,就好比一個公司,市場經理肯定沒有審批項目經理的請假的權限吧,項目經理也沒有刪除公司人員信息的權限吧,等等,其實除了最高權限的管理員,很多的用戶和角色都是只有操作使用到或者相關連的權限。這樣可以保證系統的安全性。mysql數據庫也是這樣的,有的用戶可能只有查看數據的權...
oracle內置角色connect與resource
內置角色connect與resource 一般情況下,在新建數據庫用戶后,都會習慣性的給用戶授權CONNECT角色和RESOURCE角色,授權語句: 但是這兩個內置的角色具體包含那些權限,卻不甚清楚。我們可以通過查詢dba_sys_privs,來查看一下 CONNECT:僅有CREATE SESSION的權限 RESOURCE:僅具有CREATE CLUSTER,INDEXTYPE,OPERATO...
MySQL8用戶與角色管理
文章目錄 MySQL用戶管理 創建用戶 查看用戶權限 添加/刪除權限 查詢表權限 使用新創建的用戶登陸 修改密碼 刪除用戶 mysql用戶管理表 caching_sha2_password插件 validate_password組件的安裝和卸載 MySQL用戶角色 方法1:模擬權限【不建議】 方法2:角色賦權【推薦】 MYSQL用戶驗證步驟 MySQL用戶管理 創建用戶 查看用戶權限 USAGE表...
角色管理與今日內容介紹
需求分析 完成權限(菜單,按鈕(權限點),API接口)的基本操作 權限與菜單,菜單與按鈕,菜單與API接口都是一對一關系。為了方便操作,在SAAS-HRM系統的表設計中,采用基于共享主鍵的形式實現一對一關系維護,并且數據庫約束,一切的關系維護需要程序員在代碼中實現。 ...
猜你喜歡
納稅服務系統【角色與用戶】
用戶與角色之間的關系 我們在做用戶模塊的時候,漏掉了最后一個功能。在新增功能中是可以選擇角色的。 用戶與角色之間的關系也是多對多 一個用戶對應多個角色 一個角色可以被多個用戶使用。 現在呢,我們的用戶表已經是寫的了。我們最好就不要修改原有的用戶表數據。那我們在不修改用戶表代碼的情況下,又怎么來實現多對多呢?? 跟角色與權限是一樣的。使用中間表來維護它們的關系就行了。 設計中間表 主鍵表 映射文件 ...
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...
FlycoTabLayout 的使用
FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...
爬蟲項目實戰八:爬取天氣情況
爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...
關于web項目的目錄問題
先給段代碼: 上面這個代碼一直出錯,我不知道原因,后面不停的查找資料發現了問題:我的web項目輸出目錄有問題,因為我也是第一次用idea寫web項目,發現很多bug 其實都沒有太大問題,我們需要注意的是你必須在out這個輸出文件夾中擁有這個文件,out輸出文件夾會默認過濾這些文件...