权限管理

、要求不同的用户登录以后可以看到不同的菜单。(后台可以实现对用户菜单的管理。)

第一步:分析数据结构

1:用户表
2:角色表
3:菜单表

其中他们的关系是  用户与角色多对多  角色与菜单多多对多 借助外键构造关系表
create database auth character set UTF8;
/*用户表*/
create table users(
  id varchar(32) primary key,
  name varchar(30),
  pwd varchar(32)
);
/*创建角色表*/
create table roles(
  id varchar(32) primary key,
  name varchar(30),
  des  varchar(100)
);

/*通过一个中间表映射多对多的关系,多对多就是多个一对多
	联合主键的特点是:两个列不能同时重复
*/
create table roleuser(
   uid varchar(32),
   rid varchar(32),
   constraint ru_pk primary key(uid,rid),
   constraint ru_fk1 foreign key(uid) references users(id),
   constraint ru_fk2 foreign key(rid) references roles(id)
);

/*创建菜单表*/
create table menus(
  id varchar(32) primary key,
  name varchar(50),
  url  varchar(100)
);
/*关联角色到菜单*/
create table rolemenu(
  mid varchar(32),
  rid varchar(32),
  constraint rm_pk primary key(mid,rid),
  constraint rm_fk1 foreign key(mid) references menus(id),
  constraint rm_fk2 foreign key(rid) references roles(id)
)

E-R图 (Entry-Relationship 实体关系图)



第二步:先写入表中几行数据进行基本分析

insert into users values('U001','Jack','1234');
insert into users values('U002','张三','4321');
insert into users values('U003','Tom','1111');

insert into roles values('R001','管理员','');
insert into roles values('R002','教师','');

insert into roleuser values('U001','R001');
insert into roleuser values('U002','R002');

insert into menus values('M001','系统管理','/sys.jsp');
insert into menus values('M002','用户管理','/user.jsp');
insert into menus values('M003','角色管理','/role.jsp');

insert into rolemenu values('M001','R001');
insert into rolemenu values('M002','R001');
insert into rolemenu values('M003','R001');
insert into rolemenu values('M003','R002');

/*查询某个拥有某个角色*/
select u.name,r.name
from users u inner join roleuser ru on u.id=ru.uid
             inner join roles r on ru.rid=r.id;
             
/*某角色拥有某菜单*/
select r.name,m.name
from roles r inner join rolemenu rm on r.id=rm.rid
             inner join menus m on rm.mid=m.id;

             
/*查询某人拥有某个菜单*/
select u.name,m.name
from users u inner join roleuser ru on u.id=ru.uid
             inner join roles r on ru.rid=r.id
             inner join rolemenu rm on r.id=rm.rid
             inner join menus m on rm.mid=m.id;


第三步:创建JavaBean(领域模型)和工具类

public class User {
	private String name;
	private String id;
	private String pwd;
}
设计界面

第四步:实现用户登录

分包:提供用户的登录,退出修改
Cn.itcast.user.
userServlet
service
userService
dao
userDao

菜单
Cn.itcast.menu
MenuServlet
MenuService
MenuDao

角色

对主页面来只有Servvlet没有service,调用别的service实现。
Cn.itcast.main
MainServlet
(没有Service)

第五步:开发登录页面

	<form name="name" action="<c:url value='/UserServlet?cmd=login'/>" method="post">
   		Name:<input type="text" name="name"/><br/>
   		pwd:<input type="text" name="pwd"/><br/>
   		<input type="submit"/>
   	</form>

第六步:开发整个的usre包

Cn.itcast.user.
userServlet
service
userService
dao
userDao

第七步:实菜单的查询功能

菜单是菜单的功能包。

              主功能,有自己的servvlet- MainServvlet

 

菜单是菜单的功能包。
主功能,有自己的servvlet- MainServvlet

第八步:使用过虑器验证/jsp/*

这只是第一步,只是验证用户有没有访问的凭证 。认证.

第九步:验证

public class AuthFilter implements Filter {

	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//获取uri
		HttpServletRequest req = (HttpServletRequest) request;
		String uri = req.getRequestURI();//Http://localhost:8080/day20/jsps/role.jsp->day20/jsps/role.jsp
		uri = uri.replace(req.getContextPath(), "");
		//组成sql
		String sql = "SELECT COUNT(1)"+
				     " FROM menus m INNER JOIN rolemenu rm ON m.id=rm.mid"+
				     " INNER JOIN roles r ON r.id=rm.rid"+
				     " INNER JOIN roleuser ru ON r.id=ru.rid"+
				     " WHERE ru.uid=? AND url=?";
		//取到用户的id
		User user = (User) req.getSession().getAttribute("user");
		try{
			QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource());
			Object o = run.query(sql,new ScalarHandler(),user.getId(),uri);
			int size = Integer.parseInt(o.toString());
			if(size==0){
				System.err.println("你没有权限....");
			}else{
				chain.doFilter(req, response);
			}
			
		}catch(Exception e){
			
		}
	}

	public void destroy() {
		// TODO Auto-generated method stub
		
	}
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值