redux-security
Version:
351 lines (244 loc) • 9.43 kB
Markdown
# redux-security
Redux security subsystem with user, group and access management
[![NPM version][npm-image]][npm-url] [![Discord][discord-image]][discord-url]

## INSTALL
### Stable
`npm i -S redux-security`
### Development
`npm i -S lokhmakov/redux-security`
## FEATURES
* Service architecture ([redux-manager](https://github.com/lokhmakov/redux-manager) powered)
* Journaling ([redux-journal](https://github.com/lokhmakov/redux-journal) powered)
* Persist state ([PouchDB](https://github.com/pouchdb/pouchdb) powered)
* Dynamic service configuration (state.config):
* docsMax = 2 - maximum docs in state.docs
* docsMaxOverRemove: true - remove old images over docsMax
* User management
* Session management
* Auth
* signup
* login
* logout
* email confirmation
* API
* local
* express
* pouch
* socket (SocketIO)
## EXAMPLES
### USERS: NODE-API
```js
require('redux-journal').enable()
const tags = 'redux-security.examples.users.node-api'
import { write, error } from 'redux-journal'
import { manager } from 'redux-manager'
import { usersLocal } from 'redux-security'
const api = usersLocal()
manager.enableLogger(require('redux-node-logger')())
manager.getStore()
api.create({ username: 'user1', password: 'password1' }).then(({ userID }) => {
write(`USER _id = ${userID} CREATED`, `${tags}.api.create`)
return api.update({ _id: userID, username: 'user2' }).then((result) => {
write(`SUCCESS result = ${result}`, `${tags}.api.update`)
return api.remove({ _id: userID })
})
}).then((result) => {
write(`SUCCESS result = ${result}`, `${tags}.api.remove`)
}).catch((e) => {
error(e)
})
```
### AUTH: NODE-API
```js
require('redux-journal').enable()
const tags = 'redux-security.examples.auth.node-api'
import { write, error } from 'redux-journal'
import { manager } from 'redux-manager'
const serviceAuth = 'auth'
const serviceSessions = 'sessions'
const serviceUsers = 'users'
import { sessionsLocal } from 'redux-security'
const apiSessions = sessionsLocal({ serviceName: serviceSessions })
import { usersLocal } from 'redux-security'
const apiUsers = usersLocal({ serviceName: serviceUsers })
import { authLocal } from 'redux-security'
const apiAuth = authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers })
manager.enableLogger(require('redux-node-logger')())
manager.getStore()
const username = 'root'
const password = 'toor'
apiUsers.create({ username, password }).then(() => {
return apiAuth.login({ username, password})
}).then((result) => {
write(`({ username = '${username}', password = '${password}'}) SUCCESS`, `${tags}.login`)
}).catch((e) => {
error(e)
})
```
## AUTH: NODE-REDUX
```js
require('redux-journal').enable()
const tags = 'redux-security.examples.auth.node-redux'
import { write, error } from 'redux-journal'
import { manager } from 'redux-manager'
const serviceAuth = 'auth'
const serviceSessions = 'sessions'
const serviceUsers = 'users'
import { sessionsLocal } from 'redux-security'
const apiSessions = sessionsLocal({ serviceName: serviceSessions })
import { usersLocal } from 'redux-security'
const apiUsers = usersLocal({ serviceName: serviceUsers })
import { authLocal } from 'redux-security'
import { authActions } from 'redux-security'
const apiAuth = authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers })
manager.enableLogger(require('redux-node-logger')())
manager.getStore()
const username = 'root'
const password = 'toor'
apiUsers.create({ username, password }).then(() => {
manager.dispatch(authActions.login({ username, password }), serviceAuth)
}).catch((e) => {
error(e)
})
```
## AUTH: NODE-SOCKET
server.js
```js
require('redux-journal').enable()
const tags = 'redux-security.examples.auth.node-socket.server'
import { write, error } from 'redux-journal'
import { manager } from 'redux-manager'
const serviceAuth = 'auth'
const serviceSessions = 'sessions'
const serviceUsers = 'users'
import { sessionsLocal } from 'redux-security'
sessionsLocal({ serviceName: serviceSessions })
import { usersLocal } from 'redux-security'
const apiUsers = usersLocal({ serviceName: serviceUsers })
import { authLocal } from 'redux-security'
import { authActions } from 'redux-security'
authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers })
manager.enableLogger(require('redux-node-logger')())
manager.getStore()
const username = 'root'
const password = 'toor'
apiUsers.create({ username, password })
import Express from 'express'
import { Server } from 'http'
import SocketIO from 'socket.io'
const PORT = 3000
const app = new Express()
const server = Server(app)
const io = SocketIO(server)
server.listen(PORT, (e) => {
if (e) return error(e)
write(`==> 🌎 0.0.0.0:${ PORT }`)
})
import { authConfigAPISocketServer } from 'redux-security'
authConfigAPISocketServer({ io })
```
client.js
```js
require('redux-journal').enable()
const tags = 'redux-security.examples.auth.node-socket'
import { write, error } from 'redux-journal'
import { manager } from 'redux-manager'
const serviceAuth = 'auth'
const serverServiceName = 'auth'
import { authSocket } from 'redux-security'
import { authActions } from 'redux-security'
const socket = require('socket.io-client')('http://localhost:3000')
authSocket({ serviceName: serviceAuth, serverServiceName, socket })
manager.enableLogger(require('redux-node-logger')())
manager.getStore()
const username = 'root'
const password = 'toor'
manager.dispatch(authActions.login({ username, password }), serviceAuth)
```
## REACT
server.js
```js
require('redux-journal').enable()
import { error, write } from 'redux-journal'
import webpack from 'webpack'
import webpackDevMiddleware from 'webpack-dev-middleware'
import webpackHotMiddleware from 'webpack-hot-middleware'
import webpackConfig from '../webpack.config'
const PORT = 3000
const app = require('express')()
const server = require('http').Server(app)
const io = require('socket.io')(server)
const compiler = webpack(webpackConfig)
app.use(webpackDevMiddleware(compiler, { noInfo: false, publicPath: webpackConfig.output.publicPath }))
app.use(webpackHotMiddleware(compiler))
app.use((req, res) => { res.sendFile(__dirname + '/static/index.html') })
server.listen(PORT, (e) => {
if (e) return error(e)
write(`==> 🌎 0.0.0.0:${ PORT }`)
})
const tags = 'redux-security.examples.auth.react.server'
import { manager } from 'redux-manager'
const serviceAuth = 'auth'
const serviceSessions = 'sessions'
const serviceUsers = 'users'
import { sessionsLocal } from 'redux-security'
sessionsLocal({ serviceName: serviceSessions })
import { usersLocal } from 'redux-security'
const apiUsers = usersLocal({ serviceName: serviceUsers })
import { authLocal } from 'redux-security'
import { authActions } from 'redux-security'
authLocal({ serviceName: serviceAuth, serviceSessions, serviceUsers })
manager.enableLogger(require('redux-node-logger')())
manager.getStore()
const username = 'root'
const password = 'toor'
apiUsers.create({ username, password })
import { authConfigAPISocketServer } from 'redux-security'
authConfigAPISocketServer({ io })
```
client.js
```js
require('redux-journal').enable()
import injectTapEventPlugin from 'react-tap-event-plugin'
injectTapEventPlugin()
import { manager } from 'redux-manager'
import { authSocket } from 'redux-security'
const serviceAuth = 'auth'
const socket = require('socket.io-client')('http://localhost:3000')
authSocket({ serviceName: serviceAuth, socket })
manager.enableLogger(require('redux-logger')())
const store = manager.getStore()
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { connect } from 'react-redux'
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'
import getMuiTheme from 'material-ui/styles/getMuiTheme'
import AppBar from 'material-ui/AppBar'
import { AuthAvatar } from 'redux-security'
import { AuthFormTabs } from 'redux-security'
const AuthAvatar1 = connect(state => ({ auth: state[serviceAuth] }))(AuthAvatar)
const AuthFormTabs1 = connect(state => ({ auth: state[serviceAuth] }))(AuthFormTabs)
const muiTheme = getMuiTheme({ palette: { accent1Color: require('material-ui/styles/colors').deepOrange500 }})
const render = () => ReactDOM.render(
<Provider store={ store }>
<MuiThemeProvider muiTheme={ muiTheme }>
<div>
<AppBar
title='redux-security'
iconElementLeft={ <div/> }
iconElementRight={ <AuthAvatar1/> }
/>
<AuthFormTabs1/>
</div>
</MuiThemeProvider>
</Provider>,
document.getElementById('app')
)
render()
```
[npm-url]: https://npmjs.org/package/redux-security
[npm-image]: https://img.shields.io/npm/v/redux-security.svg?style=flat
[discord-url]: https://discord.gg/CSJq3CU
[discord-image]: https://discordapp.com/api/servers/203409883263926272/widget.png?style=button