【100分】求权限分配全过程!
上次发过一个权限的帖子,大家都是讲了下框架和设计思路方面的想法。
其实我自己也看了一些权限的文章,现在的状态就是设计思路明白,但是不知道具体该怎么写!
希望各位大大能简单的给出关键语句部分的写法,最好能写写从最开始类和方法的定义到最后怎样实现!
我现在的情况是:以前的权限模块已经写好,现在不知道怎么添加权限属性,怎么把权限属性与用户其他属性一起绑定,导入数据库或者遍历全过程。还有不知道怎么分配多级权限?
问题点数:100、回复次数:27Top
1 楼wadsunglow(东)回复于 2005-01-06 17:33:23 得分 0
upTop
2 楼classjava(原始野人)回复于 2005-01-06 17:40:02 得分 0
帮upTop
3 楼dvictor(大学之道 在明明德)回复于 2005-01-06 17:51:58 得分 0
关注......Top
4 楼cnfalcon(中国猎鹰)回复于 2005-01-06 17:54:55 得分 0
发的帖子在什么地方,帖一下看看Top
5 楼darkula(流浪街头的呆子)回复于 2005-01-06 18:09:25 得分 50
我写过的一些代码,你做下参考
在用户登陆时,设置2个session
session.setAttribute("login","true");//简单的判断登陆状态,可以在表里做个字段,登陆时改那个字段的值也可以;
session.setAttribute("userGroup","admin");//登陆时根据表里的用户组ID,来定义不同的SESSION值;
在一个类文件中定义一个获取用户组信息的方法:
public String checkUserGroup(int userGroupID){
String msg=null;
switch(userGroupID){
case 0: msg = "admin";break;
case 1: msg = "user";break;
default : msg = "guest";//可以根据需求加用户组
}
return msg;
}
}//end checkUserGroup
在登陆的servlet或JSP页里使这个方法就可以得到相应的组名了;用这2个SESSION值来判断用户的状态和组;
再写一个filter,doFilter方法大致如下
public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
{
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hres = (HttpServletResponse)res;
HttpSession session = hreq.getSession();
String isAdmin = null;
try{
isAdmin = (String)session.getAttribute("userGroup");//获得页面的session值
if(!(isAdmin==null) && isAdmin.equals("admin") ){//判断其是管理员则放行;
chain.doFilter(req,res);
}else{
System.out.println("is not admin");//测试使
hres.sendRedirect(error_page.jsp);
}
}catch(Exception e){
e.printStackTrace();
}
}//end doFilter
写好过滤器后,去项目的web.xml里进行filter的设置,设置其要进行保护的文件夹:
<filter>
<filter-name>CheckAdminGroup</filter-name>
<filter-class>bookshop.filter.CheckAdminGroup</filter-class>
</filter>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/secret/*</url-pattern>
</filter-mapping>
这样你在admin,secret里的所有资源,就都被这个过滤器保护起来了,一个过滤器可以对多个资源进行保护,你就按这样的思路,再写个判断用户是否登陆,和一个用户是否属于用户组的过滤器,就实现权限分级了;
Top
6 楼darkula(流浪街头的呆子)回复于 2005-01-06 18:13:18 得分 0
假设你的方法封在MyClass.java里了
用户登陆时,组的session设置:
int userGroup = 你从库中提出的值;
session.setAttribute("userGroup",new MyClass().checkUserGroup(userGroup));
Top
7 楼darkula(流浪街头的呆子)回复于 2005-01-06 18:39:40 得分 0
设置用户:tomcat\conf\tomcat-users.xml
然后例子你就照着:tomcat\webapps\examples\WEB-INF\web.xml
下的<security-constraint>这部分配就好了Top
8 楼MopeLeo(烂迹天涯)回复于 2005-01-06 18:49:18 得分 0
写个页面给超级管理员手动的给角色赋予权限,然后添家用户的时候分配相应的角色就可以了啊!Top
9 楼nouveau(路漫漫其修远兮)回复于 2005-01-06 19:00:10 得分 0
markTop
10 楼black_flame(连滚带爬做IT)回复于 2005-01-07 03:10:31 得分 0
谢谢darkula(流浪街头的呆子)的示例!此问题结贴后我另外再给你分好吗?重要的是你的这些提示给了我很大的信心!^_^
cnfalcon(中国猎鹰)我前面的问题在http://community.csdn.net/Expert/topic/3690/3690125.xml?temp=.69331
MopeLeo(烂迹天涯)因为时间紧迫我也想先这么做 可是BOSS不答应!-_-
我想我没说清楚吧。现在我手头有用户表(user)、用户对应角色表(usermappingrole)、用户对应操作表(usermappingoperation)、角色表(role)、角色对应操作表(rolemappingoperation)、操作表(operation)、名单(employee)7个表。
我对权限设置具体步骤不是很了解,现在得按BOSS的意图写。尽量帮帮我吧!我想问的是:
1。一开始,我想用一个二进制数组对应权限(因为划分等级较多以及考虑可扩展性)。这里二进制如何转换十进制呢?希望有例子。(翻遍CSDN只找到可用的十进制转二进制的语句,可惜这里没用)
比如我设定了除admin之外的6级权限(比如0000 0000 对应一级),那么我要定义一个有6个部分的二进制数组吧。那么我把数组转换为十进制的数字串后,用什么方法使对应等级的用户获得这个数字串呢
2。谁了解表之间的对应还有映射关系,能不能介绍一下。
3。看了别人的帖子,好象权限可以以树结构来一级级关联起来(比如superadmin->admin->),但是都是讲方法没有具体的说,能否给出简单的示例、方法来?
4。设定好各级权限后怎样使各级别只能看到权限内的页面或者数据(不明白其中的具体方法和语句)
5。设定好各级权限后,怎样使各级别只能执行相应的操作(添加删除等)也是不明白方法语句
6。具体要改动或者添加哪里的baen和XML?(除了上面大大说的以外)还需要写什么类呢?
7。我对过滤器还不是很熟悉,大大帮忙写个简单的判断用户是否登陆,和一个用户是否属于用户组的过滤器行吗?
8。父 -》子 -》位置 逻辑上来设计具体如何实现,能否给个例子
9。页面上写好权限语句,那么我这个划分级别的方法怎么通过父 -》子 -》位置 和数据库的表对应起来呢?
10。很简单的问题,就是不明白:登陆页面中只有用户ID和PWD,如何通过SESSION与权限绑定并在所有页面里起到作用?(首先就是不明白传递ID和PWD的SESSION写法)。
先想到这些,半夜提问语无伦次,希望表尽情的BS我啊,分不多,差不多这次就散干净了,希望能抛砖引玉。Top
11 楼joyaga(joyaga)回复于 2005-01-07 08:01:21 得分 0
学习学习顶Top
12 楼speedingman(尘埃)回复于 2005-01-07 09:00:07 得分 0
upTop
13 楼boneeater(狗狗)回复于 2005-01-07 09:33:38 得分 10
权限的分配可以分按具体的功能分配和按资源的分配,建一个专门的用户权限对应表用以存放每个用户的相关权限.功能的分配是用户的可进行操作的项,资源的分配就是用户具体操作涉及到数据库中数据时的限制(比如说id<100的系统参数普通用户不可改等限制).功能的分配可以提供功能树链接来面向用户,当然连接得通过action来转入以避免用户直接打url就可进入,资源的分配也得建一个表,用于确定用户对于某个功能的数据操作限制.
还有为了便于管理,最好有角色作为权限的载体,一个用户实际的权限可以这样组成:专门分配给他的和他所具有的所有角色的权限合集.
这是我上一个工程的权限模块的大体做法,在此抛砖引玉........希望得到大家的指正......Top
14 楼prcgolf(小鸟)回复于 2005-01-07 09:40:58 得分 0
upTop
15 楼dvictor(大学之道 在明明德)回复于 2005-01-07 09:41:51 得分 0
upTop
16 楼lmcctvjava(无心)回复于 2005-01-07 10:13:03 得分 0
mark
Top
17 楼wangkunhong(乔.Jo)回复于 2005-01-07 10:19:38 得分 0
没做过UP。。Top
18 楼black_flame(连滚带爬做IT)回复于 2005-01-07 13:15:20 得分 0
希望高手能来详细谈谈具体操作步骤啊~~~~~Top
19 楼damaha999(追求成功的男人)回复于 2005-01-07 13:38:59 得分 0
up studing
Top
20 楼tangyongtgyg(星***辰)回复于 2005-01-07 13:50:00 得分 0
学习Top
21 楼darkula(流浪街头的呆子)回复于 2005-01-07 15:24:32 得分 20
权限分配可能用STRUTS会好做点,但我还没有开始看,抱歉现在只能想到这些,可能高手们比较懒的回答这些问题吧,我前不久自己钻时也很痛苦,能了解你的心情:P,给你个写过的判定用户是否登陆的FILTER:
/*
判断发送请求的用户,是否已登陆
*/
package bookshop.filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ConfirmLogin extends HttpServlet implements Filter{
String error_page = "/bookshop/error";
private FilterConfig filterConfig;
/*
做主要的过滤动作
*/
public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
{
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hres = (HttpServletResponse)res;
HttpSession session = hreq.getSession();
String loginPass = null;
try{
loginPass = (String)session.getAttribute("login");//这里的login是在用户登陆时打进session的值
if(!(loginPass==null) && loginPass.equals("true") ){
chain.doFilter(req,res);
}else{
hres.sendRedirect(error_page);
}
}catch(Exception e){
e.printStackTrace();
}
}
/*
初始化
*/
public void init(FilterConfig config)throws ServletException{
this.filterConfig = config;
}
/*
销毁过滤器
*/
public void destroy(){
this.filterConfig = null;
}
}
---------------------------------------------------
编译后再去你项目的WEB-INF下设置web.xml
<filter>
<filter-name>confirmLogin</filter-name>
<filter-class>bookshop.filter.ConfirmLogin</filter-class>
</filter>
<filter-mapping>
<filter-name>confirmLogin</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>confirmLogin</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
<filter>标是对你的过滤器类文件的定义,然后在<filter-mapping>中使用你定义的虚拟名称来对要保护的资源地址进行定义,可以是多个,也可以是servlet;
这样再配合上面说的权限判定的filter,就可以实现权限分级了;不过后来想想这样还是麻烦,要为每一组的用户都写一个filter……这样写还是为了练练手,新人嘛~~~
再来看你的表结构:
用户对应操作表(usermappingoperation)<--这个表是做什么用的?记录用户操作时的参数?
做数据库操作时,用Hibernate会好点吧,但还是老问题。。我也刚开始看这东西。。。我最近刚写了一个多表操作的模块,实现的方法也还是比较笨。。。供你参考下吧:
每个表对应2个类文件,一个是set && get的方法,另一个是对这个表的所有操作,例如:删除,插入,更新等;
Top
22 楼darkula(流浪街头的呆子)回复于 2005-01-07 15:55:00 得分 20
对应你的user表,写2个类文件看看吧:
首先是set && get的类,用来做传递数据使:
package myProject.sample;
import java.io.*;
public class User implements Serializable{
//每个变量对应表的字段,名字尽量一样
private int userID;
private String userName;
private int userGroupID;
//每个变量对应set && get方法,进行存取,字段的排列也尽量和表的一致
public void setUserID(int id){
this.userID = id;
}
public int getUserID(){
this.userID;
}
public void setuserName(String name){
this.userName = name.trim();
}
public int getUserName(){
this.userName;
}
public void setUserGroupID(int id){
this.userGroupID = id;
}
public int getUserGroupID(){
this.userGroupID;
}
}
-------------------------------------------
然后去写个对应用户表的操作类:
package myProject.sample;
import java.sql.*;
public class UserManager{
private Connection conn;//这个用来创建连接数据库
private PreparedStatement pstmt;
private ResultSet rst;
//实例化时获得一个连接
public UserManager(){
//这个方法是写在数据库连接的类里,方法是静态的
conn = DBConnection.getConnection();
}
/*
插入一条用户记录
*/
public void addUser(User userInfo){//这里接收的对象,需要是User的
try{
pstmt = conn.prepareStatement("insert into user(userid,username,usergroupid) values(?,?,?)");
pstmt.setInt(1,userInfo.getUserID());//这里就是刚才写的方法
pstmt.setString(1,userInfo.getUserName());
pstmt.setString(1,userInfo.getUserGroupID());
pstmt.execute();
}catch(Exception ex){
}finally{
try{
conn.close();
}catch(SQLException ex){
}
}//end finally block
}//end addUser method
}
----------------------------------------------
这样你在servlet或JSP里写时,只要实例化这2个类,然后,再把相应的值,该转的转,该限制的限制后,就可以插进库里了;
User user = new User();
UserManager userManager = new UserManager();
//接前页的值
int userID = Integer.parseInt(req.getParameter("userID"));
String userName = req.getParameter("userName");
int userGrpID = Integer.parseInt(req.getParameter("userGroupID"));
//将三个值分别设置进User
user.setUserID(userID);
user.setUserName(userName);
user.setUserGroupID(userGrpID);
//然后调用刚写好的方法,将其插进表里
userManager.addUser(user);
OK,搞定,其他的地方都是细节的了,大体的操作都是如此;要注意的就是,象这样写的操作表的类,在同一servlet里使时,要每次调用方法,就创建一个新的实例,因为每次操作结束,连接都会被关掉,为这问题我郁闷了8小时进去……教训呀……
最好写个创建实例的类,每次取实例都去那里调条方法出来就OK了~~~Top
23 楼darkula(流浪街头的呆子)回复于 2005-01-07 15:56:26 得分 0
...这里写错了,应该顺序排下去……SORRY……
pstmt.setInt(1,userInfo.getUserID());
pstmt.setString(1,userInfo.getUserName());
pstmt.setString(1,userInfo.getUserGroupID());
改成:
pstmt.setInt(1,userInfo.getUserID());//这里就是刚才写的方法
pstmt.setString(2,userInfo.getUserName());
pstmt.setString(3,userInfo.getUserGroupID());Top
24 楼seakingwy(JAVAing~重新开始)回复于 2005-01-07 16:57:17 得分 0
期待!Top
25 楼black_flame(连滚带爬做IT)回复于 2005-01-07 21:11:47 得分 0
恩 学习ing~~~~~期待更多的讨论!帖子周一结贴!!!Top
26 楼black_flame(连滚带爬做IT)回复于 2005-01-09 12:03:16 得分 0
顶上去 !!!期待留言~~~Top
27 楼pengpong(网上飘)回复于 2005-05-11 10:21:15 得分 0
haotieTop




