SpringSecurity框架的使用2

实现自定义认证类

我们之前做的验证都是在application-security配置文件中写死的

我们如何实现自定义从数据库中指定一个用户来登录呢?可以自定义一个认证类,该类实现UserDetailsService接口即可

package com.offcn.util;

import java.util.ArrayList;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import com.offcn.pojo.TbSeller;
import com.offcn.service.SellerService;

//自定义认证类,需要实现UserDetailsService接口
public class UserDetailServiceImpl implements UserDetailsService {

	private SellerService sellerService;
	//注入service对象,因为我们不能通过注解的形式获取对象,所以要配合spring配置文件中来获取bean
	public void setSellerService(SellerService sellerService) {
		this.sellerService = sellerService;
	}

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
		grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_SELLER"));
		TbSeller tbSeller = sellerService.findOne(username);
		if(tbSeller!=null) {
			//在登录的时候要确保用户已经审核通过
			if(tbSeller.getStatus().equals("1")) {
				return new User(username,tbSeller.getPassword(), grantedAuthorities);
			}else {
				return null;
			}
		}else {
			return null;
		}
	}
}

因为我们没有sellerService依赖,不能直接获取对象,那要怎么获取对象呢?--因为sellerService接口在dubble中发布了服务,我们只需要配置好dubble就可以对象了,然后通过在spring中配置即可获取对象,然后控制层中用set方法来注入对象.

密码加密

用户表的密码通常使用MD5等不可逆算法加密后存储,为防止彩虹表破解更会先使用一个特定的字符串(如域名)加密,然后再使用一个随机的salt(盐值)加密。 特定字符串是程序代码中固定的,salt是每个密码单独随机,一般给用户表加一个字段单独存储,比较麻烦。 BCrypt算法将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独处理salt问题

登录后页面如何获取登录用户名

不用查询数据库,后台写一个控制类调用静态工具类SecurityContextHolder中的方法即可

如何实现退出登录

在注销的a链接中写logout,此值是固定的,会被applicationContext-security拦截并去到指定页面

面包屑查询

要想实现这样的操作,我们可以使用面包屑查询方法.具体思路是:我们定义一个查询方法,页面用ng-init方法在页面加载时初始化一个查询所有的结果,因为总共有三级目录,每一级目录都是一个查询结果,即一个list集合, 所以我们定义一个变量用来记录查询到哪一级,再定义两个对象,把查询的结果赋值给该对象,以便返回上一级时直接取结果,因为这时候不能根据id查,所以定义一个变量直接拿结果是最好的方法.同时当查询到最底下时我们最好不提供查询下级标签,因为此时已经没有结果了,所以我们引入一个新标签ng-if,该标签要配合span使用 标签的作用就是通过控制span标签的显示与否来决定button标签是否显示,当达到条件时显示标签,否则不显示.

首先我们定义一个控制级别的变量,然后再定义一个给这个变量赋值的函数,然后在定义一个函数和两个对象引用,这两个对象引用分别对应下两级通过查询获取的对象,对象存在域中,以便点击的时候向上返回,下面获取数据是根据id去对象中查询得到的,要注意的是,向下查询时我们是向数据库中查询的,一级一级获取id查询,向上返回时我们是直接拿的存在域中的对象,没有通过查询,不用担心id问题.这里的遍历,第一个是初始化的时候查询来的所有对象的遍历,当点击下一级时,这时候的entity就是查询到的二级list的遍历,同理三级也是

顶级分类列表直接给值,因为就是根据id=0查的,所以直接定义一个json对象传进去就可以了{id:0},二级和三级则传入查询来的对象.

三级联查获取三级分类数据

想要实现这种三级联查,步骤和面包屑查询差不多,首先我们在页面加载的时候初始化一个方法,获取一级分类对象

然后我们再写二级查询,这里用到一个新的函数$scope.$watch("属性名",function(newValue,oldValue))监测,一级分类是默认执行的,此时监测到一级id存在,开始进入function,newValue就是entity.goods.category1Id,if判断常量相当于true,null相当于false.

 

这里我们定义的属性名为id值,因为表中字段就是id,这样方便封装对象,ng-option和ng-repeat都是遍历对象,ng-option顾名思义是用在下拉列表中遍历的标准格式是item.id for item in itemCatList1,as item.name是给遍历得到的值item.id起别名,因为页面显示id别人也不知道是什么,起了别名后就会显示item.name,这时候我们不仅能看到名字,还能获取id

页面

controller

// 获取一级分类
$scope.selectCatList1 = function(){
	goodsService.selectCatList1(0).success(
		function(response){
			$scope.itemCatList1 = response;
		}
	);
}
// 获取二级分类
$scope.$watch('entity.goods.category1Id',function(newValue,oldValue){
	if(newValue){ // 如果一级分类选中数据
		// 开始查询二级分类
		goodsService.selectCatList1(newValue).success(
			function(response){
				$scope.itemCatList2 = response;
				//当点击一级查询的时候,entity.goods.category1Id有值,二级分类查询导致,同时给三级分类赋值为空,为什么赋空值不在一级分类?因为一级分类是
				//初始化加载的,只执行一次
				$scope.itemCatList3 = "";
			}
		);
	}
});
// 获取三级分类
$scope.$watch('entity.goods.category2Id',function(newValue,oldValue){
	if(newValue){ // 如果一级分类选中数据
		// 开始查询二级分类
		goodsService.selectCatList1(newValue).success(
			function(response){
				$scope.itemCatList3 = response;
			}
		);
	}
});

// 获取模板id
$scope.$watch('entity.goods.category3Id',function(newValue,oldValue){
	if(newValue){ // 如果一级分类选中数据
		// 开始查询二级分类
		itemCatService.findOne(newValue).success(
				function(response){
					$scope.entity.goods.typeTemplateId = response.typeId;
				}
		);
	}
	
});

富文本编辑器KindEditor的使用

要使用富文本编辑器,首先要在页面引入相关的js,接着初始化富文本编辑器,注意初始化富文本编辑器一定要在网页的上面,否则不生效.然后在控制层中为指定的对象赋值editor.html即可.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值