认证和授权的概念
认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁??
授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能做什么??
shiro框架的简单介绍
shiro框架的核心功能有四大部分:认证、授权、会话管理和加密。
认证流程如下:
其中,Application Code:应用程序代码,开发人员负责
Subject:框架提供的接口,代表当前用户对象。
SecurityManager:框架提供的接口,代表安全管理器对象。
Realm:可以开发人员编写,框架也可以提供,类似dao。
Maven项目中shiro框架的应用:
1,首先引入shiro框架的相关jar:
<dependency>
<gruopId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.2</version>
<dependcy>
2,在web.xml中配置spring框架提供的用于整合shiro框架的过滤器
<!-- 配置spring框架提供的用于整合shiro框架的过滤器 --> --------------必须在struts2过滤器之前
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3,在spring配置文件中配置bean,id为shiroFilter
<!-- 配置shiro框架的过滤器工厂对象 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 注入安全管理器对象 -->
<property name="securityManager" ref="securityManager"/>
<!-- 注入相关页面访问URL -->
<property name="loginUrl" value="/login.jsp"/> 登录页面
<property name="successUrl" value="/index.jsp"/> 认证成功页面
<property name="unauthorizedUrl" value="/unauthorized.jsp"/> 权限不足的页面
<!--注入URL拦截规则 -->
<property name="filterChainDefinitions">
<value>
/css/** = anon (anon:匿名访问,不登录也能访问,authc是拦截所有请求)
/js/** = anon
/easyUI/** = anon
/images/** = anon
/validatecode.jsp* = anon (验证码生成的jsp)
/login.jsp = anon
/userAction_login = anon
/page_base_staff.action = perms["staff-list"] (perms:检查权限的过滤器,没有跳转权限不足页面)
/* = authc
</value>
</property>
</bean>
<!-- 注册安全管理器对象 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm"/>
<property name="cacheManager" ref="cacheManager"></property>
</bean>
<!-- 注册缓存器对象 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<!-- 注册ehcache配置文件 -->
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"></property>
</bean>
<!-- 注册自定义的realm -->
<bean id="bosRealm" class="xxx.BOSRealm">
</bean>
4,在登陆的servlet/action/controller中修改登录方法:
/ 用户登录功能
public String login() throws Exception {
// 1,接受页面参数
// 从域中获得验证码
String key = (String) ActionContext.getContext().getSession().get("key");
// 判断验证码是否正确
if(key.equals(checkcode) && StringUtils.isNotBlank(checkcode)){
// 验证码正确,获得当前登录用户对象
Subject subject = SecurityUtils.getSubject();
// 用户密码令牌
AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), MD5Utils.md5(model.getPassword())); ------------用传进来的username和password生成token
try {
subject.login(token);
User user = (User) subject.getPrincipal();
ServletActionContext.getRequest().getSession().setAttribute("user", user);
return "toIndex";
} catch (Exception e) {
this.addActionError("您输入的账号或密码有误");
return "login";
}
}else{
this.addActionError("您输入的验证码有误");
return "login";
}
}
5,realm代码的编写:
public class BOSRealm extends AuthorizingRealm{
@Autowiredprivate IUserDao userDao;
//认证方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken mytoken = (UsernamePasswordToken)token; --------------上文生成的token
String username = mytoken.getUsername();
//根据用户名查询数据库中的密码
User user = userDao.findUserByUserName(username);
if(user == null){
//用户名不存在
return null;
}
//如果能查询到,再由框架比对数据库中查询到的密码和页面提交的密码是否一致
AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
return info; -----------第一个传的是user,上文就可以取出user放到session
}
//授权方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}