一个用户可以有多个角色,一个角色可以有多个权限
一.所需表
1.角色表(t_role)
id | int | 角色ID |
roleName | varchar | 角色名 |
id | int | 用户ID |
userName | varchar | 用户名 |
password | varchar | 密码 |
roleId | int | 外键关联角色表的id |
id | int | 权限ID |
permissionName | varchar | 权限名 |
roleId | int | 外键关联角色表的id |
public class MyRealm extends AuthorizingRealm{
private UserDao userDao=new UserDao();
private DbUtil dbUtil=new DbUtil();
/**
* 为当前登录的用户授予角色和权限
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String userName=(String)principals.getPrimaryPrincipal();
/*
SimpleAuthorizationInfo 为AuthorizationInfo 的实现类,为授权信息类
调用authorizatioInfo的setRoles(Set<String> roleNames)设置角色
调用authorizatioInfo的setStringPermissions(Set<String> permissions)设置权限
*/
SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
Connection con=null;
try{
con=dbUtil.getCon();
authorizationInfo.setRoles(userDao.getRoles(con,userName));
authorizationInfo.setStringPermissions(userDao.getPermissions(con,userName));
}catch(Exception e){
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return authorizationInfo;
}
/**
* 验证当前登录的用户
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String userName=(String)token.getPrincipal();
Connection con=null;
try{
con=dbUtil.getCon();
User user=userDao.getByUserName(con, userName);
if(user!=null){
/**
SimpleAuthenticationInfo类为AuthenticationInfo类的实现类,为认证类
将从数据库获取的userName,password传进去会自动与token中的信息对比认证
*/
AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUserName(),user.getPassword(),"xx");
return authcInfo;
}else{
return null;
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
三.编写shiro.ini配置文件
[main]
#未通过认证的用户跳转到login
authc.loginUrl=/login
#为通过角色和权限的用户跳到unauthorized.jsp
roles.unauthorizedUrl=/unauthorized.jsp
perms.unauthorizedUrl=/unauthorized.jsp
#自定义realm所在类
myRealm=com.wm.realm.MyRealm
#将自定义的realm交给securityManager管理
securityManager.realms=$myRealm
[urls]
#各种请求所需的认证/角色/授权
/login=anon
/admin*=authc
/student=roles[teacher]
/teacher=perms["user:create"]