上来不说废话,直接进入正题
权限:需要一个权限表
create table privilege
(
id varchar(40) primary key,
name varchar(240) not null unique,
description varchar(255)
);
资源表:看这个资源拥有哪些权限
create table resource
(
id varchar(40) primary key,
uri varchar(255) not null unique,
description varchar(255),
privilege_id varchar(40),
constraint privilege_id_FK foreign key(privilege_id) references privilege(id)
);
角色表:一个系统中的角色
create table role
(
id varchar(40) primary key,
name varchar(40) not null unique,
description varchar(255)
);
用户表:记录用户数据
create table user
(
id varchar(40) primary key,
username varchar(40) not null,
password varchar(40) not null,
description varchar(255)
);
因为角色和权限是多对多的关系,一个角色可以拥有多个权限,同时,一个权限也可以赋予多个角色,所以要在角色和权限之间建立一张中间表
create table role_privilege
(
role_id varchar(40),
privilege_id varchar(40),
primary key(role_id,privilege_id),
constraint role_id_FK foreign key(role_id) references role(id),
constraint privilege_id_FK1 foreign key(privilege_id) references privilege(id)
);
一个用户可以拥有多个角色,一个角色也可以被多个用户拥有,所以用户和角色还是多对多的关系,也需要建立中间表
create table user_role
(
user_id varchar(40),
role_id varchar(40),
primary key(user_id,role_id),
constraint user_id_FK foreign key(user_id) references user(id),
constraint role_id_FK1 foreign key(role_id) references role(id)
);
权限的重点在于表的设计,设计好表,再写dao层,service层,然后控制层,再view层
//过滤器--:过滤用户未登录就访问权限资源
public class SecurityFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
//1.检查用户是否已登录
User user=(User) request.getSession().getAttribute("user");
//2.没登录,登陆去
if (null==user) {
request.setAttribute("message","请先登录");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
//3.得到用户想访问的资源
String uri=request.getRequestURI();
//4.得到访问该资源需要的权限
SecurityService service=new SecurityService();
Resource r=service.findResource(uri);
if (null==r) {//资源为空,表示资源不被权限限制
chain.doFilter(request, response);
return;
}
Privilege required_privilege=r.getPrivilege();//得到用户访问资源的权限
//5.判断用户是否有相应的权限
List<Privilege> list=service.getUserAllPrivilege(user.getId());//得到用户所有权限
if (!list.contains(required_privilege)) {
//自定义对象比较,必须重写equals方法和hashcode方法
//6.没有权限,则提示用户权限不足,联系管理员
request.setAttribute("message","对不起,你没有权限访问该资源");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
//7.如果有,则放行
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}