1、权限既然写在配置文件中,那么数据库中只需要三个表即可。@个人博客
1)t_user 用户表
2)t_role 角色表
3)t_user_role 用户角色表
2、对应的领域实体
1)用户
package cn.luxh.app.domain; /** * 用户 * @author Luxh */ public class User { private Integer id; /**帐号*/ private String account; /**密码*/ private String password; @Override public int hashCode() { return account.hashCode(); } @Override public boolean equals(Object obj) { User user = (User) obj; return this.account.equals(user.getAccount()); } //getter setter //... }
2)角色
package cn.luxh.app.domain; /** * 角色 * @author Luxh */ public class Role { private Integer id; /**角色名称*/ private String name; //getter setter //... }
3)用户-角色
package cn.luxh.app.domain; /** * 用户角色 * @author Luxh */ public class UserRole { private Integer id; /**用户id*/ private Integer userId; /**角色id*/ private Integer roleId; //getter setter //... }
3、配置文件
在web.xml文件中加上如下内容:
<!-- SpringSecurity权限框架 --> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 获取Spring Security session的生命周期--> <listener> <listener-class> org.springframework.security.web.session.HttpSessionEventPublisher </listener-class> </listener>
当然配置spring监听器的时候得把springsecurity的权限配置文件给加载进去:
<!-- 配置Spring监听器 --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml,classpath:application-security.xml</param-value> </context-param>
权限配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <!-- 登录页面不拦截 --> <http pattern="/login" security="none" /> <!-- 资源文件不拦截 --> <http pattern="/resources/**" security="none" /> <http auto-config="true" use-expressions="true" access-denied-page="/denied"> <!-- default-target-url 指定了从登录页面登录后进行跳转的页面 always-use-default-target true表示登录成功后强制跳转 authentication-failure-url 表示验证失败后进入的页面 login-processing-url 设置验证登录验证地址,如果不设置,默认是j_spring_security_check username-parameter,password-parameter 设置登录用户名和密码的请求name,默认:j_username,j_password default-target-url="/user/home" --> <form-login login-page="/login" always-use-default-target="true" authentication-success-handler-ref="successHandler" authentication-failure-handler-ref="failureHandler" /> <!-- 管理员和普通用户可以访问 --> <intercept-url pattern="/index" access="hasAnyRole('ROLE_ADMIN','ROLE_USER')" /> <!-- 管理员和普通用户可以访问 --> <intercept-url pattern="/common" access="hasAnyRole('ROLE_ADMIN','ROLE_USER')" /> <!-- 只有管理员可以访问 --> <intercept-url pattern="/admin" access="hasAnyRole('ROLE_ADMIN')" /> <!-- 退出后到登陆页面 --> <logout logout-success-url="/login" /> <!-- error-if-maximum-exceeded 后登陆的账号会挤掉第一次登陆的账号 session-fixation-protection 防止伪造sessionid攻击. 用户登录成功后会销毁用户当前的session. 创建新的session,并把用户信息复制到新session中. --> <session-management invalid-session-url="/login?error=3" session-fixation-protection="none"> <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login?error=2" /><!-- 阻止第二次登录 --> </session-management> </http> <authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="UserDetailsService"/> </authentication-manager> <beans:bean id="UserDetailsService" class="cn.luxh.app.security.UserDetailsServiceImpl" /> <!-- 登录成功业务处理 --> <beans:bean id="successHandler" class="cn.luxh.app.security.LoginAuthenticationSuccessHandler"> <beans:property name="url" value="/index"></beans:property> </beans:bean> <!-- 登录失败业务处理 --> <beans:bean id="failureHandler" class="cn.luxh.app.security.LoginAuthenticationFailureHandler"/> </beans:beans>
4、权限配置文件中用到的类
1)UserDetailsServiceImpl
package cn.luxh.app.security; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import cn.luxh.app.domain.Role; import cn.luxh.app.domain.User; import cn.luxh.app.persistence.RoleMapper; import cn.luxh.app.persistence.UserMapper; public class UserDetailsServiceImpl implements UserDetailsService{ private static Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); @Autowired private UserMapper userMapper; @Autowired private RoleMapper roleMapper; /** * @param account 登录帐号 */ public UserDetails loadUserByUsername(String account) throws UsernameNotFoundException { log.info("登录账号:"+account); org.springframework.security.core.userdetails.User userDetails = null; User user = userMapper.selectByAccount(account); //账号密码错误,可以在这里手动抛出异常,让验证失败处理器AuthenticationFailureHandler进行处理 Collection<GrantedAuthority> grantedAuthorities = getGrantedAuthorities(user); boolean enables = true; boolean accountNonExpired = true; boolean credentialsNonExpired = true; boolean accountNonLocked = true; userDetails = new org.springframework.security.core.userdetails.User(user.getAccount(), user.getPassword(), enables, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuthorities); return userDetails; } /** * 根据用户获取该用户拥有的角色 * @param user * @return */ private Set<GrantedAuthority> getGrantedAuthorities(User user) { Set<GrantedAuthority> grantedAuthorities = new HashSet<GrantedAuthority>(); List<Role> roles = roleMapper.selectByUserId(user.getId()); if(roles != null) { for(Role role : roles) { grantedAuthorities.add(new SimpleGrantedAuthority(role.getName())); } } return grantedAuthorities; } }
UserMapper和RoleMapper是我使用MyBatis访问数据库的接口。
2)LoginAuthenticationSuccessHandler
package cn.luxh.app.security; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; /** * 登录验证成功处理器 * @author Luxh */ public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler{ private static Logger log = LoggerFactory.getLogger(LoginAuthenticationSuccessHandler.class); //登录验证成功后需要跳转的url private String url; public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { log.info("登录验证成功:"+request.getContextPath()+url); //response.sendRedirect(request.getContextPath()+url); request.getRequestDispatcher(url).forward(request, response); } public void setUrl(String url) { this.url = url; } }
3)LoginAuthenticationFailureHandler
package cn.luxh.app.security; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; /** * 登录验证出错处理 * @author Luxh */ public class LoginAuthenticationFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException ae) throws IOException, ServletException { //根据AuthenticationException异常的类型 //进行出错业务逻辑处理 //... response.sendRedirect(request.getContextPath()+"/login"); } }
5、SpringMVC的Controller
1)LoginController
package cn.luxh.app.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class LoginController { private static Logger log = LoggerFactory.getLogger(LoginController.class); /** * 登录入口 */ @RequestMapping(value={"/","/login"}) public String login(@RequestParam(required=false) String error) { log.info("login......"); if("1".equals(error)) { log.info("验证失败!"); }else if("2".equals(error)) { log.info("你的帐号已登录,不允许重复登陆!"); }else if("3".equals(error)) { log.info("会话超时!"); } return "login"; } /** * 没有权限访问跳转url */ @RequestMapping(value="/denied") public String denied(){ log.info("denied......"); return "denied"; } /** * 超时跳转url */ @RequestMapping(value="/timeout") public String timedout(){ log.info("timeout......"); return "timedout"; } }
2)IndexController
package cn.luxh.app.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class IndexController { private static Logger log = LoggerFactory.getLogger(IndexController.class); /** * 管理员和普通用户可以访问 */ @RequestMapping(value="/index") public String index(){ log.info("index......."); return "index"; } /** * 管理员和普通用户可以访问 */ @RequestMapping(value="/common") public String myJsp(){ log.info("common......."); return "common"; } /** * 管理员可以访问 */ @RequestMapping(value="/admin") public String admin(){ log.info("admin......."); return "admin"; } }
6、源码,不含jar包
spring3.2.2+springsecurity3.1.3+myBatis3.2.2
http://files.cnblogs.com/luxh/app3.rar
相关推荐
在Spring Security 3中,主要的配置文件名为`security.xml`,这个文件定义了整个安全体系的结构。 1. **核心组件** - `http`: 这个元素定义了HTTP安全配置,包括拦截URL、登录页面设置、访问控制等。例如,你可以...
在配置文件中,我们可以设置`AuthenticationManager`,指定如何处理用户提交的凭证。 2. **授权(Authorization)**: 授权是决定已认证的用户可以访问哪些资源。Spring Security支持基于角色的访问控制(RBAC)、...
教程文档`教你使用_SpringSecurity_3.0_52页.pdf`会详细指导你如何一步步配置和使用Spring Security。它应该包含了配置文件的示例、如何集成到Spring应用中、如何创建自定义认证逻辑以及如何进行授权设置等内容。...
在这个“springboot springsecurity动态权限控制”的主题中,我们将深入探讨如何在Spring Boot项目中集成Spring Security,实现动态权限控制,让菜单权限的管理更加灵活和高效。 首先,我们需要理解Spring Security...
在基于数据库的权限管理配置中,Spring Security 允许我们存储、管理和验证用户的访问权限,这使得权限控制更加灵活和可扩展。下面将详细阐述如何进行Spring Security的数据库权限管理配置。 1. **配置数据源** 在...
- **配置 web.xml**:在 web.xml 文件中配置 Spring Security 的过滤器链。 - **最小 `<http>` 配置**:使用 `<http>` 元素可以轻松地配置 HTTP 认证和授权规则。 - **自动配置**:`auto-config` 属性可以自动配置...
在Spring Security 3中,核心配置通常位于一个或多个XML文件中,这些文件定义了安全拦截规则、用户认证信息以及权限分配。在我们的示例中,我们将关注以下几个关键元素: 1. **** 元素:这是Spring Security配置的...
在`pom.xml`或`build.gradle`文件中,你需要引入Spring Security的依赖。对于Maven用户,添加如下代码: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-security ``` 对于...
在 Spring Security 中,身份验证是通过 AuthenticationManager 和 AuthenticationProvider 实现的。AuthenticationManager 负责管理身份验证过程,而 AuthenticationProvider 负责执行具体的身份验证逻辑。 在 ...
在 Spring 配置文件中需要配置安全相关的 bean。数据库配置主要是用于存储用户身份和权限信息。 数据库设计 数据库设计是 Spring Security 的核心组件之一。Spring Security 需要五个基础表来存储用户身份和权限...
这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security使用手册.pdf" 将深入探讨这些概念,并提供实践指导,帮助读者掌握如何在实际项目中应用Spring Security。通过学习这些...
(4)项目除了security3的配置使用XML以外,其他基本使用注解配置完成 (5)项目采用的是5张数据表结构。前台及后台各采用了5张数据库表。当然你也可以进行修改后合并。 (6)数据库采用MYSQL 备份文件在src文件夹下...
在传统的权限管理中,权限配置通常硬编码在应用程序中,这使得权限调整变得困难,每次变动都需要重新部署应用。然而,通过动态授权,我们可以将用户、角色和资源信息存储在数据库中,允许在运行时动态配置权限,而...
在Spring Security 2.0中,我们需要在Spring配置文件中声明必要的bean,如`http`、`authentication-manager`和`access-decision-manager`。`http`配置定义了请求过滤规则,`authentication-manager`负责用户认证,`...
本项目“SpringSecurity+OAuth2+JWT分布式权限控制”旨在提供一个完整的解决方案,帮助开发者构建安全的、基于微服务的分布式应用程序。 Spring Security 是一个强大的和高度可定制的身份验证和授权框架,适用于...
在"SpringSecurity2Demo"这个项目中,我们可以预期看到以下组成部分: 1. **配置文件**: `spring-security.xml`,这是Spring Security的核心配置文件,包含了过滤器链的配置、用户认证源、授权规则等。 2. **控制...
Spring Security的配置灵活,可以通过XML配置文件、Java配置类或者注解来定制安全策略。它还提供了大量的扩展点,允许开发者根据自己的业务需求进行定制和扩展。 Spring Security的学习过程可以分为入门、进阶和...