说到权限系统是每一个后台管理系统,很重要也是必不可少的一块功能,今天就给大家准备了如何设计好一个权限管理系统,该系统是基于SSH(Spring+Spring MVC+Hibernate)整合之后的基本上进行实现。
我采用的是市场比较流行的Apache shiro,以下是对该框架的简介。
Apache Shiro 是一个框架,可用于身份验证和授权。
身份验证和授权
在对系统进行安全保障时,有两个安全性元素非常重要:身份验证和授权。虽然这两个术语代表的是不同的含义,但出于它们在应用程序安全性方面各自的角色考虑,它们有时会被交换使用。
Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权。使用 Shiro,您就能够为您的应用程序提供安全性而又无需从头编写所有代码。
--------------------------------------------------------------------------------
还有spring security框架
问题:
权限控制应该控制哪些地方?(菜单级别)
不同的人看到的是不同的菜单
防止有人恶意通过猜测URL地址进入(过滤器判断)
学东西我们应该一步一步的来,首面我们需要在已有框架上加入shiro,配置方式如下:
1、导入相关的包
org.apache.shiro
shiro-spring
1.3.2
2、web.xml加入Shiro的支持
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
targetFilterLifecycle
true
shiroFilter
/*
3、Spring整合Shiro
创建application-shiro.xml文件,并引入到spring的配置文件中
/fulllogin/**=anon
/randCodeImage=anon
/favicon.ico = anon
/admin_files/** = anon
/** = authc
4、创建自定义
public class ShiroDbRealm extends AuthorizingRealm {
public static final String SESSION_USER_KEY = "keduoxSession";
/**
* 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用,负责在应用程序中决定用户的访问控制的方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
User user = (User) SecurityUtils.getSubject().getSession().getAttribute(ShiroDbRealm.SESSION_USER_KEY);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
if("admin".equals(user.getName())){
info.addRole("admin");
}
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//得到输入的用户名和密码
UsernamePasswordToken upt=(UsernamePasswordToken)token;
System.out.println(String.valueOf(upt.getPassword()));
String username=upt.getUsername();
System.out.println("输入的用户名为:"+username);
//从数据库中查询用户名
User user=new User();
user.setName("admin");
user.setPassword("123456");
if(!user.getName().equals(username)){
return null;
}
//将数据库的值存入到session中
Session session=SecurityUtils.getSubject().getSession();
//将值给session设置值
session.setAttribute(SESSION_USER_KEY, user);
Object principal = token.getPrincipal();
System.out.println(principal+"-----------");
return new SimpleAuthenticationInfo(principal, user.getPassword(), this.getName());
}
}
4、修改登录方法
UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword().toCharArray(), null);
try {
SecurityUtils.getSubject().login(token);
} catch (AuthenticationException e) {
System.out.println("登录有异常信息");
e.printStackTrace();
}
return "success.jsp";
5、页面中使用注解权限配置
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %>
success
登录之后
不在登录状态时
用户在没有RememberMe时
用户在RememberMe时
在有abc或者123角色时
拥有角色abc
没有角色abc
拥有权限资源abc
没有abc权限资源
显示用户身份名称
显示用户身份中的属性值
通过上面的方式,跑通以后,加入注解的方式进行拦截:
1、spring-servlet中使用以下配置
2、方法上面配置以下注解
@RequiresRoles("admin2")
注解说明:
@ RequiresAuthentication
可以用户类/属性/方法,用于表明当前用户需是经过认证的用户。
@ RequiresGuest
表明该用户需为”guest”用户
@ RequiresPermissions
当前用户需拥有制定权限
@RequiresRoles
当前用户需拥有制定角色
--------------------------------------------------------------------------------
统一处理异常
SPRING MVC
/403
以上有不懂的或者需要源码,我们可以互相讨论:加我QQ123880681
@来自科多大数据