Spring有很多不同的模块。 所有这些对于具体目的都是有用的。 今天,我将讨论Spring Security。 该模块提供了灵活的方法来管理访问Web应用程序不同部分的许可。 在这篇文章中,我将研究Spring MVCHibernateMySQLSpring Security的集成。

任何Web应用程序的常规情况都是某些用户组之间的功能分离。 例如,具有“主持人”角色的用户可以编辑数据库中的现有记录。 一个用户
具有“管理员”角色的用户可以执行与具有“主持人”角色的用户相同的操作,并创建新记录。 在Spring MVC中,可以使用Spring Security来实现许可管理。

目标

作为示例,我将在Hibernate中使用示例Spring MVC应用程序。 用户及其角色将存储在数据库中。 MySQL将用作数据库。 我将创建三个表:用户,角色,user_roles。 您可能会猜到user_roles表是一个中间表 。 在应用程序中将扮演两个角色:主持人和管理员。 将有几个页面可供主持人和管理员访问。

制备

为了使Spring Security在项目中可用,只需在pom.xml文件中添加以下依赖项:

<!-- Spring Security --><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-core</artifactid><version>3.1.3.RELEASE</version></dependency><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-web</artifactid><version>3.1.3.RELEASE</version></dependency><dependency><groupid>org.springframework.security</groupid><artifactid>spring-security-config</artifactid><version>3.1.3.RELEASE</version></dependency>

我必须在数据库中创建三个表,并在其中插入几条记录。

CREATE TABLE `roles` (`id` int(6) NOT NULL AUTO_INCREMENT,`role` varchar(20) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;CREATE TABLE `users` (`id` int(6) NOT NULL AUTO_INCREMENT,`login` varchar(20) NOT NULL,`password` varchar(20) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;CREATE TABLE `user_roles` (`user_id` int(6) NOT NULL,`role_id` int(6) NOT NULL,KEY `user` (`user_id`),KEY `role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是角色和用户的代码:

INSERT INTO hibnatedb.roles (role) VALUES ('admin'), ('moderator');INSERT INTO hibnatedb.users (login, password) VALUES ('moder', '111111'), ('adm', '222222');INSERT INTO hibnatedb.user_roles (user_id, role_id) VALUES (1, 2), (2, 1);

主要部分

项目的完整结构具有以下结构:

由于您可以在GitHub上找到该项目,因此我将忽略当前主题之外的一些内容。 我想从每个Web项目的心脏开始,我的意思是web.xml文件。 Spring Security基于简单的过滤器,因此我需要在部署描述符中添加过滤器的声明:

...<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>
...

现在是时候为用户和角色表创建实体了:

@Entity
@Table(name="users")
public class User {@Id@GeneratedValueprivate Integer id;private String login;private String password;@OneToOne(cascade=CascadeType.ALL)@JoinTable(name="user_roles",joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")})private Role role;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLogin() {return login;}public void setLogin(String login) {this.login = login;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;} }

@Entity
@Table(name="roles")
public class Role {@Id@GeneratedValueprivate Integer id;private String role;@OneToMany(cascade=CascadeType.ALL)@JoinTable(name="user_roles", joinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")},inverseJoinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")})private Set userRoles;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}public Set getUserRoles() {return userRoles;}public void setUserRoles(Set userRoles) {this.userRoles = userRoles;}}

每个实体类都需要DAO和Service层。

public interface UserDAO {public User getUser(String login);}

@Repository
public class UserDAOImpl implements UserDAO {@Autowiredprivate SessionFactory sessionFactory;private Session openSession() {return sessionFactory.getCurrentSession();}public User getUser(String login) {List userList = new ArrayList();Query query = openSession().createQuery("from User u where u.login = :login");query.setParameter("login", login);userList = query.list();if (userList.size() > 0)return userList.get(0);elsereturn null;  }}

分别用于Role类:

public interface RoleDAO {public Role getRole(int id);}

@Repository
public class RoleDAOImpl implements RoleDAO {@Autowiredprivate SessionFactory sessionFactory;private Session getCurrentSession() {return sessionFactory.getCurrentSession();}public Role getRole(int id) {Role role = (Role) getCurrentSession().load(Role.class, id);return role;}}

服务层使用相同的对:

public interface UserService {public User getUser(String login);}

@Service
@Transactional
public class UserServiceImpl implements UserService {@Autowiredprivate UserDAO userDAO;public User getUser(String login) {return userDAO.getUser(login);}}

分别用于Role类:

public interface RoleService {public Role getRole(int id);}

@Service
@Transactional
public class RoleServiceImpl implements RoleService {@Autowiredprivate RoleDAO roleDAO;public Role getRole(int id) {return roleDAO.getRole(id);}}

以上只是机械的常规代码。 现在让我们研究Spring Security代码。 为了将Spring Security插入到项目中,我必须创建CustomUserDetailsS​​ervice类并实现UserDetailsS​​ervice接口。

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;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.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.sprsec.dao.UserDAO;@Service
@Transactional(readOnly=true)
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserDAO userDAO;    public UserDetails loadUserByUsername(String login)throws UsernameNotFoundException {com.sprsec.model.User domainUser = userDAO.getUser(login);boolean enabled = true;boolean accountNonExpired = true;boolean credentialsNonExpired = true;boolean accountNonLocked = true;return new User(domainUser.getLogin(), domainUser.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked,getAuthorities(domainUser.getRole().getId()));}public Collection getAuthorities(Integer role) {List authList = getGrantedAuthorities(getRoles(role));return authList;}public List getRoles(Integer role) {List roles = new ArrayList();if (role.intValue() == 1) {roles.add("ROLE_MODERATOR");roles.add("ROLE_ADMIN");} else if (role.intValue() == 2) {roles.add("ROLE_MODERATOR");}return roles;}public static List getGrantedAuthorities(List roles) {List authorities = new ArrayList();for (String role : roles) {authorities.add(new SimpleGrantedAuthority(role));}return authorities;}}

该类的主要目的是将应用程序的User类映射到Spring Security的User类。 这是Spring Security的杀手级功能之一。 这样,您可以使任何种类的Spring MVC应用程序适应Security模块的使用。

控制器和视图

有关Spring Security的最常见问题之一是如何创建自定义登录表单 。 答案很简单。 您需要使用该表单创建一个JSP文件,并在其中指定action属性()。

URL映射的大部分取决于spring-security.xml文件:

...<http auto-config="true"><intercept-url pattern="/sec/moderation.html" access="ROLE_MODERATOR"><intercept-url pattern="/admin/*" access="ROLE_ADMIN"><form-login login-page="/user-login.html" default-target-url="/success-login.html" authentication-failure-url="/error-login.html"><logout logout-success-url="/index.html"></logout></form-login></intercept-url></intercept-url></http><authentication-manager><authentication-provider user-service-ref="customUserDetailsService"><password-encoder hash="plaintext"></password-encoder></authentication-provider></authentication-manager>
...

如您所见,我为以下各项指定了URL:登录页面,成功登录后的默认页面,凭据无效情况下的错误页面。 我也声明了需要一些访问许可的URL。 最重要的是身份验证管理器的声明。 通过这种方式,Spring Security将使用数据库来识别用户及其角色。

控制器:

@Controller
public class LinkNavigation {@RequestMapping(value="/", method=RequestMethod.GET)public ModelAndView homePage() {return new ModelAndView("home");}@RequestMapping(value="/index", method=RequestMethod.GET)public ModelAndView indexPage() {return new ModelAndView("home");}@RequestMapping(value="/sec/moderation", method=RequestMethod.GET)public ModelAndView moderatorPage() {return new ModelAndView("moderation");}@RequestMapping(value="/admin/first", method=RequestMethod.GET)public ModelAndView firstAdminPage() {return new ModelAndView("admin-first");}@RequestMapping(value="/admin/second", method=RequestMethod.GET)public ModelAndView secondAdminPage() {return new ModelAndView("admin-second");}}

@Controller
public class SecurityNavigation {@RequestMapping(value="/user-login", method=RequestMethod.GET)public ModelAndView loginForm() {return new ModelAndView("login-form");}@RequestMapping(value="/error-login", method=RequestMethod.GET)public ModelAndView invalidLogin() {ModelAndView modelAndView = new ModelAndView("login-form");modelAndView.addObject("error", true);return modelAndView;}@RequestMapping(value="/success-login", method=RequestMethod.GET)public ModelAndView successLogin() {return new ModelAndView("success-login");}}

您可以在GitHub上看到的视图 。

请注意在WebAppConfig java类中添加@ImportResource(“ classpath:spring-security.xml”)。

摘要

我认为本文将帮助您深入了解Spring Security。 我在这里使用了Hibernate和MySQL,因为这样的技术组合在Internet上的其他教程中并不经常使用。 可能您注意到我在项目中使用了一些XML,这是因为当前尚无办法使用基于注释的方法来实现所有这些东西。

参考资料: Spring MVC:来自JCG合作伙伴 Alexey Zvolinskiy(来自Fruzenshtein的注释博客)的MySQL和Hibernate的安全性 。

翻译自: https://www.javacodegeeks.com/2013/05/spring-mvc-security-with-mysql-and-hibernate.html

Spring MVC:MySQL和Hibernate的安全性相关推荐

  1. 通用后台管理系统(ExtJS 4.2 + Spring MVC 3.2 + Hibernate)

    通用后台管理系统(ExtJS 4.2 +Spring MVC 3.2 + Hibernate) 开发语言JAVA 成品成品 前端技术extjs 数据库mysql,sql server,oracle 系 ...

  2. spring mvc mysql配置_spring mvc配置数据库连接

    ACM 配置中心实战:Spring + MyBatis + Druid + ACM 很多基于 Spring MVC 框架的 Web 开发中,Spring + MyBatis + Druid 是一个黄金 ...

  3. 自己做的创新创业项目管理系统spring mvc+mysql+mybatics毕业设计

    自己做的创新创业项目管理系统,采用Eclipse或idea作开为发平台,以Java为开发语言进行开发.采用的技术有spring  mvc,mysql,mybatics,jsp,servlet等技术.后 ...

  4. spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

    一.准备工作 1. 首先创建一个表: CREATE TABLE `t_user` ( `USER_ID` int(11) NOT NULL AUTO_INCREMENT, `USER_NAME` ch ...

  5. 在Spring MVC中使用Apache Shiro安全框架

    我们在这里将对一个集成了Spring MVC+Hibernate+Apache Shiro的项目进行了一个简单说明.这个项目将展示如何在Spring MVC 中使用Apache Shiro来构建我们的 ...

  6. Spring MVC 题库管理系统 课程设计作业

    前言:这个系统原本是为了(强国答题)学习而做的.后台感觉这样提交的话,交到学校里感觉不太好,故改名题库管理系统. 先说下本系统的功能: 1.用户的登陆,注册,修改密码,退出等操作. 2.对题的增删改查 ...

  7. Spring MVC Hibernate MySQL集成CRUD示例教程

    Spring MVC Hibernate MySQL集成CRUD示例教程 我们在上一篇教程中学习了如何集成Spring和Hibernate.今天,我们将继续前进,并将Spring MVC和Hibern ...

  8. Spring MVC + Spring + Hibernate + mysql 注册登陆入门实例

    Spring MVC + Spring + Hibernate + mysql 注册登陆入门实例 (1) 结构 (说明目的是要做在线聊天室的,也包含登陆注册部分,先用这部分做个例子)开发环境用的是ST ...

  9. 使用IDEA整合spring4+spring mvc+hibernate

    配置文件  spring-mvc.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans ...

最新文章

  1. 重磅!国内首个面向自动驾驶领域的多传感器数据融合系统课程
  2. OSChina 周日乱弹 —— 做一只舔狗,开心时就去舔她,不开心时就舔自己
  3. OpenStack 系列之File Share Service(Manila)详解
  4. 只适合小模型小训练集的交叉验证
  5. ARM再次表态:不会向华为断供芯片技术
  6. 天翼云从业认证课后习题(第一章和第二章)
  7. 云炬WEB开发教程2-2 node.js和npm介绍和安装
  8. 36 张图梳理 Intellij IDEA 常用设置,太全了值得收藏!
  9. 记一次sql优化之索引的引用
  10. 各种门锁的内部结构图_便宜超好用:小米智能门锁 E上手体验报告
  11. 架构师必须补充的能力
  12. go - const
  13. delphi教程 | 第一个程序
  14. 【热点】印度年轻人跟中国年轻人有什么不同
  15. Linux下用五笔输入法
  16. [Python-turtle]正弦定理能擦出多漂亮的火花?【1】
  17. xshell 连接vbox 虚拟机
  18. 解决win8无法使用内置管理员账户打开
  19. httpcanary和fiddler的使用教程
  20. dedecms怎么改php版本_王者荣耀:管你版本怎么改,这几位峡谷常青树始终屹立不倒...

热门文章

  1. 8.2-指令周期(学习笔记)
  2. fork/join和线程池_从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存...
  3. jetty设置双向ssl_在Jetty中设置SSL
  4. dynamodb容器使用_使用DynamoDBMapper插入DynamoDB项目
  5. cloud foundry_将Spring Boot应用程序绑定到Cloud Foundry中的服务的方法
  6. java 拼图_功能项目拼图将Java 9引入
  7. 虚拟机间延迟测量_简单的类来测量延迟
  8. java iterable_太糟糕了,Java 8没有Iterable.stream()
  9. 管理多个Java安装
  10. mockito模拟依赖注入_使用Mockito模拟自动装配的字段