今天继续SpringSecurity,今天我们来聊基于角色的权限用户登录,我们来看下面的这个思路图:
上面就是基于角色的权限控制图,接下来我们来实现他:
第一步:定义两个页面。一个是User可以访问的,一个是admin可以访问的。其中User普通用户可以访问的我们定义为userWelCome.jsp,管理员admin可访问的我们定义为:adminWelCome.jsp
第二步:创建处理用户登录成功以后访问的处理对象及实现:
package com.alibaba;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
/**
* 用户登录成功以后进行处理
*@description:
*@author chendawei
*/
public class LoginDispatcherHandler extends SimpleUrlAuthenticationSuccessHandler{
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
@Override
protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
String targetUrl = determineTargetUrl(authentication);
if (response.isCommitted()) {
System.out.println("Can't redirect");
return;
}
redirectStrategy.sendRedirect(request, response, targetUrl);
}
/**
* 此方法提取当前已登录用户的角色并返回
* 适当的URL根据他的角色。
* @param authentication
* @return
*/
protected String determineTargetUrl(Authentication authentication) {
String url = "";
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
List<String> roles = new ArrayList<String>();
for (GrantedAuthority a : authorities) {
roles.add(a.getAuthority());
}
if (isAdmin(roles)) {
url = "/SpringSecurityPageController/toAdminWelComePageJsp";
} else if (isUser(roles)) {
url = "/SpringSecurityPageController/toUserWelComePageJsp";
} else {
url = "/SpringSecurityPageController/gotoUserLoginPageJsp";
}
return url;
}
private boolean isUser(List<String> roles) {
if (roles.contains("ROLE_USER")) {
return true;
}
return false;
}
private boolean isAdmin(List<String> roles) {
if (roles.contains("ROLE_ADMIN")) {
return true;
}
return false;
}
public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
this.redirectStrategy = redirectStrategy;
}
protected RedirectStrategy getRedirectStrategy() {
return redirectStrategy;
}
}
第三步:修改springsecurity.xml文件。其中在<http>标签里删除default-target-url和always-use-default-target属性,添加authentication-success-handler-ref属性。在<http>标签外添加<beans:bean id="loginDispatcherHandler" class="com.alibaba.LoginDispatcherHandler"></beans:bean>。然后添加每个角色可以访问的资源。
删除部分如下图:
添加部分如下图:
图一:
图二:
图三:
上图中,具有ADMIN角色的用户可以访问以toAdmin开头的页面资源, 具有USER角色的用户可以访问以toUser开头的页面资源。
第四步:在user列表中定义用户和用户所拥有的角色:
第五步:查看结果。我们用chendawei用户和zhaoxiuping两个用户访问登录界面,应该会跳转到不同的页面。
用chendawei用户访问:
访问的结果,注意观察地址栏里面的变化:
用zhaoxiuping用户访问:
访问的结果,注意观察地址栏里面的变化:
以上就是基于角色的权限用户登录。有个问题大家可以看到我们的用户的列表都定义在了springsecurity.xml中这样做很不好,不利于用户的动态添加和删除等扩展,比较好的办法就是将用户的这些信息等配置到数据库中,这样就可以动态的扩展了。下一篇我们来说一下这个实现的方式。